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.fisc...@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. >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe