Zuerst Sie die Art der >>=
verstehen müssen; Ich gehe davon aus, dass du es tust, da es auf Seite 2 dieses Papiers steht und du hast es hinter dich gebracht.
Die Definition für Bind ist möglicherweise einfacher zu verstehen, wenn wir runState
definieren.
newtype SM s a = SM (s -> (a, s))
runState :: SM a -> s -> (a, s)
runState (SM f) s = f s
-- this is equivalent to
-- runState (SM f) = f
runState
läuft einen Zustand monadisch durch die Funktion, die das Extrahieren f
s
den Zustand und die Anwendung auf den Anfangszustand umwandelt. Die Funktion f
gibt ein Tupel vom Typ (a, s)
zurück. Das Tupel enthält den vom Zustand abhängigen Wert (vom Typ a
) und einen neuen Zustand (vom Typ s
). Im folgenden sind äquivalent
let (a, s') = runState x s
in ...
let SM x' = x
(a, s') = x' s
in ...
Beide extrahieren die Funktion x'
, wie der Zustand von x
transformiert wird, dann gilt es auf einen Anfangszustand s
. Das resultierende Tupel (a, s')
enthält den zustandsabhängigen Wert a
und den neuen Zustand s'
.
Wir können die SM
Mustererkennung in der Definition von >>=
durch runState
ersetzen.
x >>= f = SM (\s -> let
(a, s') = runState x s
(b, s'') = runState (f a) s'
in (b, s''))
Jetzt werden wir Stück für Stück durchgehen.
Bind erstellt ein neues StateMonad
mit einer Funktion, die von einem Anfangszustand s
abhängt. Es gibt einen zustandsabhängigen Wert b
und einen neuen Zustand s''
:
x >>= f = SM (\s -> let
...
in (b, s''))
Die zustandsabhängigen Wert a
und ein neuer Zustand s'
durch Ausführen des Zustandsmonadisch x
mit dem Anfangszustand s
berechnet werden:
let
(a, s') = runState x s
Eine neue Zustandsmonade f a
wird aus der vom Benutzer gelieferten Funktion f
und dem zustandsabhängigen Wert a
ermittelt. Diese zweite Zustands-Monade wird mit dem Zwischenzustand s'
betrieben. Er berechnet einen anderen zustandsabhängigen Wert b
und einen Endzustand s''
.
(b, s'') = runState (f a) s'
Der zweite zustandsabhängigen Wert b
und der Endzustand s''
sind, was durch die Funktion für den neuen StateMonad
konstruiert zurückgegeben.
Ihre Transkription fehlt ein sehr wichtiger Teil. Die zweite Zeile des 'let' sollte 'SM (a, s') = x 's' sein. – Cirdec
Danke, repariere es. – dimid