[Haskell-cafe] Re: Re: type class question

Jules Bean jules at jellybean.co.uk
Thu Dec 6 11:57:59 EST 2007


Ben Franksen wrote:
> Ryan Ingram wrote:
>> On 12/5/07, Ben Franksen <ben.franksen at online.de> wrote:
>> You would have to use functional dependencies or associated types to
>> eliminate this error.  Alternatively, you can add a dummy argument of type
>> "block" and pass "undefined :: BlockType" in to help choose the instance
>> declaration.
> 
> Sounds reasonable, and in fact that was what I tried first. However
> 
> data Command = Skip
> 
> class Java block command | command -> block where
>   block_ :: [command] -> block
> 
>   compBlock :: [Command] -> block
>   compBlock = block_ . map compCommand
> 
>   compCommand :: Command -> command
> 
> still gives
> 
>     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)
> 
> which is /exactly/ the same error as I get w/o the fundep.

Yes, because command determines block but block doesn't determine command.

So in a usage of 'compBlock' it has no way of deciding which 'command' 
to use, although it can choose the block from the return type.

You could have command -> block, block -> command, if that is indeed true.

Jule


More information about the Haskell-Cafe mailing list