[Haskell-cafe] Multi-parameter Type Class

Paul Keir pkeir at dcs.gla.ac.uk
Thu Dec 11 09:37:41 EST 2008

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?

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20081211/32583b06/attachment.htm

More information about the Haskell-Cafe mailing list