私はこれに続く続きを一般的に理解しようとしています。tutorial。State MonadのCPS版では `get`はどのように動作しますか?
しかし、私は困難がセクション2.10で次の例を理解するために持っています:
# let get() =
shift (fun k -> fun state -> k state state) ;;
get : unit => ’a = <fun>
state
私は考えタイプint
です。私が得ないのは、k
のタイプです。私の理解によると、k
は、すべての計算がget()
後、その後来る取得し、我々は状態モナドについて話していることから、k
が故に、
k : int => 'a
しかしからint
を取ることによって継続される計算を表現するのが妥当ですコードは、それを行うにはいないようですし、それが実際に意味二度目のためstate
をとります。
k : int => int => 'a
を私は二番目はどこから来ている取得しない、としたget
を感知しますのunit => int => 'a
の代わりにunit => 'a
と入力しますか?
は実際の状態モナドの実装と比較すると、混乱がもっと追加:
newtype StateT s m a = StateT { runStateT :: s -> m (a,s) }
すなわち、状態遷移が私の最初の理解と一致した結果と、状態の組、に状態から関数として表されます。
誰もリードを与えることはできますか?
次に、ハスケルのControl.Monad.Trans.Cont
を使用してget
をここに実装する方法を教えてください。私はタイプシステムを快適にする問題を抱えています。
UPDATE私は2番目1つを得たようだ
:
Prelude Control.Monad.Trans.Cont> let get() = shift $ \k -> return $ \i -> k i i
しかし、私は継続に二度の状態を適用する必要がある理由私はまだ得ることはありません。
@Bergi実際にはOchaCamlと呼ばれています。私はチュートリアルに従っていますが、使用している言語がこの場合の概念の理解に影響を与えているとは思いません。 – HuStmpHrrr