
On Sun, Apr 08, 2001 at 11:34:45AM +0000, Marcin 'Qrczak' Kowalczyk wrote:
... I found a way to express map and zipWith, but it's quite ugly. I would be happy to have a better way.
class Map c' a' c a | c' -> a', c -> a, c' a -> c, c a' -> c' where map :: (a' -> a) -> c' -> c ... -- zipWith is similar to map, only more complicated: class ZipWith c1 a1 c2 a2 c a | c1 -> a1, c2 -> a2, c -> a, c1 a -> c, c a1 -> c1, c2 a -> c, c a2 -> c2 where zipWith :: (a1 -> a2 -> a) -> c1 -> c2 -> c ...
You raise many interesting question, but let me ask about one: why the specific choice of functional dependencies above? Why is "c' a -> c" necessary for Map? Why doesn't ZipWith include, e.g., "c1 a2 -> c2"? (I don't have a lot of experience with these functional dependencies...)