
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