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@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.