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

Stateの実装はFunctorです。私はそれがどのように機能するのか理解できません。特に、gは関数として使用されますが、私の目では関数ではありません。それは単なる目的(たぶん関数)ですが、なぜそれが機能しているのか理解できません。結局のところ、何らかの状態でなければならないので、例えばIntファンクターインスタンスの状態

を明記してください。

+1

通常、あなたは '' State sa = State(s - >(s、a)) 'を持っています。' 'g''は' s - >(s、a) '型の関数です(すなわち、結果(この場合は 'a')と新しい状態(' s1'))を返します。この 'Functor'インスタンスは、単に値を返す前に計算の結果に' f'を適用します。 – Bakuriu

+0

名前の状態は本当に混乱しており、状態はモナド自体です。モナドとは、状態にアクセスしたり、状態を変更したりするものです。 – mb14

答えて

4

あなたの状態のタイプがどのように見えるように見えます:あなたが

fmap f (State g) = State $ \s0 -> 
に入力された状態値に一致したときに

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

:ので、あなたのfmap機能が型を持っている必要があり

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

gは、関数s -> (a, s)ですdをタイプs -> (b, s)の1つを構築する。

(a, s1) = g s0 

は、新しい状態に結果にas1を結合、既存のステートフル計算への入力状態を適用します。その後、変更されない状態がgから返されながら

(f a, s1) 

にマッピングされた結果値を得るために、afを適用します。

+1

*「状態は変わらないが」*はやや曖昧です。 "gによって返された状態は変わらない"という方が良いかもしれない。 – Zeta

+1

@Zeta - あまりにも曖昧でした。 – Lee