0

私はこの声明を持っています:

newtype State st a = State (st -> (st, a))

したがって、タイプStateは次のとおりです。

State :: (st -> (st, a)) -> State st a

意味がわかりません:

  • st2つのデータ型のa単なるプレースホルダーですか?右?
  • このステートメントは、Stateが引数として関数をとる関数であることを意味しますか?
4

2 に答える 2

2

はい。データコンストラクターは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
于 2012-06-05T18:47:27.370 に答える
1

はい、はい。はst状態タイプであり、aは回答タイプです。

于 2012-06-05T16:12:55.333 に答える