2013-06-27 6 views
5

Dieses MonadState Beispiel aus http://book.realworldhaskell.org/read/monad-transformers.html kopiert, gibt mir einen Fehler mit GHC 7.4.2MonadState Instanz von Real World Haskell nicht kompiliert

instance (MonadState s m) => MonadState s (MaybeT m) where 
    get = lift get 
    put k = lift (put k) 

gibt

Illegal instance declaration for `MonadState s (MaybeT m)' 
    (All instance types must be of the form (T a1 ... an) 
    where a1 ... an are *distinct type variables*, 
    and each type variable appears at most once in the instance head. 
    Use -XFlexibleInstances if you want to disable this.) 
In the instance declaration for `MonadState s (MaybeT m)' 

Wenn ich XFlexibleInstances hinzufügen, Ich werde dann aufgefordert, stattdessen XUndecidableInstances hinzuzufügen - ich denke nicht, dass ich diese Erweiterungen hier brauchen sollte. Wie kann diese Instanz kompiliert werden?

Antwort

5

Wenn Sie betrachten, sehen Sie, dass es auch in der "offiziellen" Implementierung verwendet wird, also denke ich, dass es benötigt wird. Der Kommentar sagt, es hat mit der Abdeckung Zustand zu tun, die in dieser Stackoverflow Fragen erklärt:

In diesem Fall ist die Variable s nicht vorhanden auf der rechten Seite Seite, und die funktionale Abhängigkeit geht von rechts nach links, also ist Ihre Instanz ungültig. (Ohne undecidableInstances)