5 Stimmen

Verständnis der Haskell-Accessor-Funktionen

Ich lese mich in Monad-Tutorials ein, und das, an dem ich gerade arbeite, ist http://www.muitovar.com/monad/moncow.xhtml aber ich bin auf ein Problem mit der State Monad gestoßen, genauer gesagt mit der runState Accessor-Funktion.

Der Typ ist definiert als

newtype State s a = State { runState :: (s -> (a,s)) } 

und es heißt z.B.

runState (chncasewst3 'e' 'd' 'f') False

Ich weiß nicht, wie ich die Definition lesen soll, um zur zweiten Zeile zu gelangen, insbesondere wegen des Teils "State s a". Wenn es "State a s" hieße, könnte ich ableiten, dass der Accessor "bis" zum "s" gecurlt wurde.

Die Frage ist also, wie ich die Typdefinition lesen kann, damit ich sehen kann, wie ich die Accessor-Funktion in dieser Situation aufrufen kann, und wenn möglich, wie ich Accessor-Funktionen an sich lesen kann.

15voto

sastanin Punkte 38556

Wenn Sie einen Datentyp haben, der als

data T a b = MkT { getA :: a, getB :: b }

es lesen wie

data T a b = MkT a b

mit zwei automatisch definierten Hilfsfunktionen:

getA :: (T a b) -> a
getA (MkT x _) = x

getB :: (T a b) -> b
getB (MkT _ y) = y

Wenn Sie sich bewerben getA auf den Wert von T ist das Ergebnis vom Typ a .

Jetzt ist Ihr State Typ besteht nur aus einem Element, das eine Funktion ist ( :: s -> (a, s) ). runState konvertiert einen Wert vom Typ State s a zu einer Funktion dieses Typs.

ghci> :t runState
runState :: State s a -> s -> (a, s)

Jedes Mal, wenn Sie sich bewerben runState auf den Wert des Typs State s a ist das Ergebnis eine Funktion des Typs s -> (a,s) . Und das erste Argument dieser Funktion ist ein Anfangswert der Zustandsvariablen (vom Typ s ).

Im Beispiel des Tutorials,

  • chncasewst3 'e' 'd' 'f' hat Typ State Bool String .
  • Also, runState (chncasewst3 'e' 'd' 'f') hat Typ Bool -> (String, Bool) .
  • Also, runState (chncasewst3 'e' 'd' 'f') False hat Typ (String, Bool) .

Lesen Sie weiter:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X