[Haskell-cafe] Functional Dependencies conflicts
Limestraël
limestrael at gmail.com
Sat Apr 17 16:01:23 EDT 2010
Yes! Sorry, I forgot a bit:
Binary types are automatically made instances of Binarizable/Unbinarizable
(that's my line 16):
instance (Binary a) => Binarizable a a where
toBinary = id
instance (Binary a, Monad m) => Unbinarizable a a m where
fromBinary = return
To me, the functional dependency in:
class (Binary b) => Binarizable a b | a -> b
meant that for each a, there only one type b that can match.
That's what I want: for every Binary type 'a', the matching Binary is also
'a'
And for GameObject, the sole matching type is String.
In other words, GameObject implies String.
I would have undestood the error if GameObject was also an instance of
Binary (then the two instances would match), but it's not the case...
Is my FunDep wrong?
I done this especially because I didn't wanted to declare each type one by
one instance of Binarizable,
Haskell type system normally enables me to automatically define a Binary as
an instance of Binarizable.
2010/4/17 Daniel Fischer <daniel.is.fischer at web.de>
> Am Samstag 17 April 2010 19:14:02 schrieb Limestraël:
> > Hello,
> >
> > Well, here comes the trouble:
> > GameStructs.hs:16:9:
> > Functional dependencies conflict between instance declarations:
> > instance (Binary a) => Binarizable a a
> > -- Defined at MagBots/GameStructs.hs:16:9-37
> > instance Binarizable GameObject String
> > -- Defined at MagBots/GameStructs.hs:38:9-37
> >
> > GameStructs.hs:19:9:
> > Functional dependencies conflict between instance declarations:
> > instance (Binary a, Monad m) => Unbinarizable a a m
> > -- Defined at MagBots/GameStructs.hs:19:9-50
> > instance (MonadReader [GameObject] m) =>
> > Unbinarizable GameObject String m
> > -- Defined at MagBots/GameStructs.hs:41:9-73
> >
> > I don't see why the functional dependencies conflict, since GameObject
> > is not an instance of Binary...
>
> Somebody somewhere might write such an instance.
> But more fundamentally:
>
> GHC doesn't look at the constraints for instance selection, so your
> instance in line 16 looks like
>
> instance Binarizable a a where ..., oh, and by the way, a must be an
> instance of Binary, otherwise please refuse to compile
>
> to the compiler. The FunDep then says in each instance (and you'd need at
> least OverlappingInstances to declare more) a and b are the same type.
> instance Binarizable GameObject String violates that FunDep.
> (Analogous for Unbinarizable.)
>
> I think removing the
>
> instance Binary a => ...
>
> and declaring an instance for the types you need manually is the easiest
> solution.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20100417/9b65fc9e/attachment.html
More information about the Haskell-Cafe
mailing list