私はこの声明を持っています:
newtype State st a = State (st -> (st, a))
したがって、タイプState
は次のとおりです。
State :: (st -> (st, a)) -> State st a
意味がわかりません:
st
2つのデータ型のa
単なるプレースホルダーですか?右?- このステートメントは、Stateが引数として関数をとる関数であることを意味しますか?
はい。データコンストラクターはHaskellの関数であり、それらに対してパターンマッチングできる追加機能があります。したがって、たとえば、タイプのリストがある場合は、をfs : [st -> (st, a)]
実行できますmap State fs :: [State st a]
。
状態モナドが従来どおりに機能する方法は、状態トランスフォーマーState st a
を表すことです。つまり、初期状態を取り、その状態に依存または変更する可能性のある計算を実行し、タイプの結果を生成するものです。2つの状態トランスフォーマーを構成するということは、最初のトランスフォーマーを初期状態で実行し、2番目のトランスフォーマーを最初のトランスフォーマーの実行後に保持される状態で実行する複合トランスフォーマーを作成することを意味します。a
したがって、State
モナド実装は、タイプの関数として直接モデル化しますst -> (st, a)
。このような2つの関数を構成することは、初期状態を最初の関数にフィードし、その結果の状態を2番目の関数に渡し、最終状態と2番目の関数の結果を返す複合関数を生成するだけです。コード内:
bindState :: State st a -> (a -> State st b) -> State st b
bindState (State function1) f =
State $ \initialState -> let (nextState, firstResult) = function1 initialState
in f firstResult
はい、はい。はst
状態タイプであり、a
は回答タイプです。