2016-04-13 7 views
0

Sehen Sie sich meinen Code an. GHCI gesagt, dassHaskell, keine Instanz für (Applicative M)

Kein Beispiel für (Applicative M) von den übergeordneten Klassen einer Instanz Erklärung entsteht In der Instanzdeklaration für ‚Monad M‘

ich nicht diesen Fehler verstehen, und ich weiß nicht weiß, wie man es repariert. Kannst du mir helfen ?

newtype M a = StOut (Stack -> (a, Stack, String)) 

unStOut (StOut f) = f 
--unStout is used to extract the emeded function from monadic capsule 

instance Monad M where 
    return x = StOut (\n -> (x, n, "")) 
    e >>= f = StOut (\n -> let  (a, n1, s1) = (unStOut e) n 
            (b, n2, s2) = (unStOut (f a)) n1 
          in  (b, n2, s1++s2)) 
+2

Grundsätzlich http://stackoverflow.com/questions/31652475/defining-a-new-monad-in-haskell-raises-no-instance-for-applicative/31652592#31652592, die Regeln in GHC geändert 7,10 – MathematicalOrchid

Antwort

0

Checkout-Definition von Monad. Long story short - um Monad zu werden, muss MApplicative sein. Was wiederum M erfordert, ist Functor.

class Applicative m => Monad m where 
class Functor f => Applicative f where 
class Functor f where 

So ist das, was der Fehler sagt.

3

Der Fehler ist genau das, was es sagt: Sie haben M eine anwendbare Instanz zu geben.

Jede Monade ist ein anwendungsfähiger Funktor. Aus historischen Gründen war es in der Vergangenheit nicht erforderlich, diese Tatsache explizit zu machen, aber dies führte zu allen Arten von Unannehmlichkeiten beim Schreiben von generischem Code. The omission has since been fixed, um jetzt eine Monad Instanz zu definieren, müssen Sie zuerst auch Functor und Applicative Instanzen definieren.

+0

Can gibst du mehr Details? –

+0

Sie meinen, erklären Sie, wie die 'Functor' und' Applicative' Instanzen für 'M' definiert werden? Ich könnte, aber das ist eine gute Übung, um sich selbst zu tun. Schau dir die Typen an. 'fmap' ist normalerweise sehr einfach zu implementieren (in der Tat kann die '-XDeriveFunctor'-Erweiterung das für Sie tun),' pure' ist dasselbe wie 'return'. Der einzige knifflige ist '<*>', aber das sollte auch machbar sein. (Wenn Sie sich nicht darum kümmern können, es selbst zu definieren: Sie können immer ['(<*>) = ap'] (http://hackage.haskell.org/package/base/docs/Control-Monad.html#v : ap), wenn die Monad-Instanz bereits beendet ist.) – leftaroundabout

Verwandte Themen