Since your map function is calling zot to convert an x to a y you must state that this is possible:
instance ZOT x y => ZOT [x] [y] where zot xs = map zot xs -- Lennart 2008/12/11 Paul Keir <[EMAIL PROTECTED]>: > Hi all, > > I've been trying to refactor my tree conversion code to make > better use of type classes; and I've discovered multi-parameter > type classes and functional dependencies. I have a class with a > function a2b, and I'd like "map" to be used when it's a list of > type a. > > I've created a simple failing example: > > data Foo = Foo Bar deriving(Show) > data Bar = Bar String deriving(Show) > > class ZOT a b | a -> b where > zot :: a -> b > > instance ZOT Foo Integer where > zot x = 17 > > instance ZOT Bar String where > zot x = "Eighteen" > > instance ZOT [x] [y] where -- This bit > zot xs = map zot xs -- fails > > main = do print $ zot $ Foo $ Bar "Blah" > print $ zot $ Bar "Blah" > print $ zot $ [Bar "Blah", Bar "Blah"] -- No map here please > > I know this would work if the third instance of zot > explicitly took [Bar] and [String]. Can I not instead generalise > for all the ADTs in my tree in the way I've outlined? Must I > instantiate for the type of each list pair? > > Cheers, > Paul > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe