[Haskell-cafe] Re: type class question

Ben Franksen ben.franksen at online.de
Wed Dec 5 19:38:24 EST 2007


Brent Yorgey wrote:
> Well, first of all, the definition of compCommand should use calls to
> compBlock, not recursive calls to compCommand.  But that's not the main
> source of your problems.
> 
> What exactly are you trying to accomplish?  And why do you need a type
> class?

Whatever the code is supposed to accomplish, there is something strange
going on with the type checking. I have managed to reduce the code (while
keeping the type error message) thus

data Command = Skip

class Java block command where
  block_ :: [command] -> block

  compBlock :: [Command] -> block
  --compBlock = block_ . map compCommand

  compCommand :: Command -> command

This compiles ok. But when I ask ghci for the type of the body of the
default definition of compBlock I get

*Main> :t block_ . map compCommand
block_ . map compCommand :: forall block block1 command.
(Java block command, Java block1 command) =>
[Command] -> block

and if I remove the comment from the default definition of compBlock I get

    Could not deduce (Java block command1)
      from the context (Java block command)
      arising from use of `block_' at Bla.hs:7:14-19
    Possible fix:
      add (Java block command1)
      to the class or instance method `compBlock'
    In the first argument of `(.)', namely `block_'
    In the expression: block_ . (map compCommand)
    In the definition of `compBlock':
        compBlock = block_ . (map compCommand)

It would be nice if someone could explain (in language that can be
understood by non-type-system-experts) why ghc(i) deduces these
strange 'duplicated' contexts.

Cheers
Ben



More information about the Haskell-Cafe mailing list