Hello,<br><br>I&#39;m trying to make two simple classe which would help me to transform unserializable datatypes to serializable ones.<br>The classes are:<br>class (Binary b) =&gt; Binarizable a b | a -&gt; b where<br>  toBinary :: a -&gt; b<br>
<br>class (Binarizable a b, Monad m) =&gt; Unbinarizable a b m | a -&gt; b where<br>  fromBinary :: b -&gt; m a<br><br>The idea is simple: if we have a type &#39;a&#39; which cannot be serialized (for instance because it contains functions), we may turn it into a &#39;b&#39; type which is instance of Binary, with of course a loss of information.<br>
And then, Unbinarizable enables us to get the original &#39;a&#39; type back. fromBinary has to run inside a monad so that it can somehow recover the lost information.<br><br>Now, for instance, in a simple role playing game, we would have the datatype :<br>
data GameObject = GameObject {<br>  objIdentifier :: String,<br>  objEffect :: Character -&gt; Character<br>}<br><br>It can&#39;t obviously be declared instance of Binary, since the field objEffect is a function. So -- since an objIdentifier must be unique -- we can declare it instance of Binarizable/Unbinarizable:<br>
instance Binarizable GameObject String where<br>  toBinary = objIdentifier<br><br>instance (MonadReader [GameObject] m) =&gt; Unbinarizable GameObject String m where<br>  fromBinary name = liftM getIt ask<br>    where getIt = maybe err id . find ((== name) . objIdentifier)<br>
          err   = error $ &quot;Unbinarize: The object &#39;&quot; ++ name ++ &quot;&#39; doesn&#39;t exist!&quot;<br><br>To be unbinarized, we need to have a ReaderMonad which grants us access to the list of all the objects, so that we may find the object from its identifier.<br>
<br><br>Well, here comes the trouble:<br>GameStructs.hs:16:9:<br>    Functional dependencies conflict between instance declarations:<br>      instance (Binary a) =&gt; Binarizable a a<br>        -- Defined at MagBots/GameStructs.hs:16:9-37<br>
      instance Binarizable GameObject String<br>        -- Defined at MagBots/GameStructs.hs:38:9-37<br><br>GameStructs.hs:19:9:<br>    Functional dependencies conflict between instance declarations:<br>      instance (Binary a, Monad m) =&gt; Unbinarizable a a m<br>
        -- Defined at MagBots/GameStructs.hs:19:9-50<br>      instance (MonadReader [GameObject] m) =&gt;<br>               Unbinarizable GameObject String m<br>        -- Defined at MagBots/GameStructs.hs:41:9-73<br><br>
I don&#39;t see why the functional dependencies conflict, since GameObject is not an instance of Binary...<br>