# Question about typing

**Dylan Thurston
**
dpt@math.harvard.edu

*Sun, 8 Apr 2001 12:38:27 -0400*

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...)