2016-04-13 13 views
2
instance Functor (State s) where 
    fmap f (State g) = State $ \s0 -> 
     let (a, s1) = g s0 
     in (f a, s1) 

Es ist die Implementierung Functor für State. Ich kann nicht verstehen, wie es funktioniert. Insbesondere wird g verwendet, da es eine Funktion wäre, aber auf meinem Auge ist es keine Funktion. Es ist nur Objekt (vielleicht Funktion), aber ich kann nicht verstehen, warum es Funktion ist. Schließlich sollte es ein Zustand sein, so kann es zum Beispiel IntFunctor Instanz des Status

Bitte machen Sie klar.

+1

Normalerweise haben Sie 'State sa = State (s -> (s, a))' 'also' g' ist eine Funktion mit dem Typ 's -> (s, a)' (dh es nimmt einen Zustand und erzeugt ein Ergebnis ("a" in diesem Fall) und ein neuer Zustand ("s1")). Diese "Functor" -Instanz wendet einfach "f" auf das Ergebnis der Berechnung an, bevor der Wert zurückgegeben wird. – Bakuriu

+0

Der Name Staat ist in der Tat verwirrend und der Staat ist eine Monade selbst. Was eine Monade ist, ist etwas, das auf einen Zustand zugreift und diesen modifiziert. – mb14

Antwort

4

Es sieht aus wie Ihr Zustand Typ wie folgt aussieht:

data State s a = State (s -> (a ,s)) 

so Ihre fmap Funktionstyp haben sollte:

fmap :: (a -> b) -> (State s a) -> (State s b) 

, wenn Sie in

fmap f (State g) = State $ \s0 -> 
auf dem Eingangszustandswert entsprechen

g ist eine Funktion s -> (a, s) und Sie brauchen d, um eine der Art s -> (b, s) zu konstruieren.

(a, s1) = g s0 

wendet den Eingabezustand in der bestehenden Stateful Berechnung a zum Ergebnis und s1 auf den neuen Zustand binden. Es gilt dann f-a das zugeordnete Ergebniswert in

(f a, s1) 

zu erhalten, während der Zustand zurück von g unverändert ist.

+1

* "während der Zustand unverändert ist." * Ist etwas mehrdeutig. "Während der ursprünglich von' g' zurückgegebene Zustand unverändert ist "könnte besser sein. – Zeta

+1

@Zeta - Ja das war mehrdeutig, danke. – Lee