私はこの声明を持っています:
newtype State st a = State (st -> (st, a))
したがって、タイプStateは次のとおりです。
State :: (st -> (st, a)) -> State st a
意味がわかりません:
st2つのデータ型の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は回答タイプです。