On Dec 5, 2007 10:38 PM, Ben Franksen <[EMAIL PROTECTED]> wrote: > data Command = Skip > > class Java block command where > block_ :: [command] -> block > > compBlock :: [Command] -> block > --compBlock = block_ . map compCommand > > compCommand :: Command -> command
My guess is that nothing's guaranteeing the calls from block_ and compCommand to be using the same 'command' type as the class head. For example, having > instance Java B C1 > instance Java B C2 you can have both > compBlock = (block_ :: [C1] -> B) . map (compCommand :: Command -> C1) > compBlock = (block_ :: [C2] -> B) . map (compCommand :: Command -> C2) Also, there's another problem: from compCommand you can't know the type of block (as it's not appearing in the signature). The modified version below typechecks: > data Command = Skip > > class Java block command | command -> block where > block_ :: [command] -> block > > compBlock :: [Command] -> block > compBlock = block_ . map (compCommand :: Command -> command) > > compCommand :: Command -> command (Note that (compCommand :: Command -> command) actually is restricting to a monomorphic type.) So, this seems to me to be a problem with multi-parameter type classes when you prune the types (on compBlock and on compCommand one of the types of the class head is missing). I'm not a wizard on this subject, please anybody correct me if I'm mistaken =). Cheers, -- Felipe. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe