5

私はこれに続く続きを一般的に理解しようとしています。tutorialState 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 

しかし、私は継続に二度の状態を適用する必要がある理由私はまだ得ることはありません。

+0

@Bergi実際にはOchaCamlと呼ばれています。私はチュートリアルに従っていますが、使用している言語がこの場合の概念の理解に影響を与えているとは思いません。 – HuStmpHrrr

答えて

3

最初のものはget()の結果に対応して(私たちはgetの効果は、現在の状態を取得し、結果としてそれを返すことにしたい)と第二の1の後の状態を渡すことに対応しているのであなたが二回statekを適用getgetは状態を変更しないため、getの前の状態と同じです)を次のステートフル計算に変更します。 a ~ s、継続タイプs -> s -> rの関数となるので、換言すれば

、状態モナドがState s a ~ s -> (a, s)あるので、そのCPSバージョンは、get : State s sためState s r a ~ s -> (a -> s -> r) -> r、などです。

+0

それは私が得ない主な部分です。すでに現在の状態を渡すだけで十分であるはずですか?私はまた、状態のモナドバージョンからcpsバージョンにステップする方法を理解していません。 – HuStmpHrrr

+0

また、コードを見るだけでどのように継続のタイプを知ることができますか?どの部分が私は見て、穴かどうか穴ですか? – HuStmpHrrr

+0

'get'の結果が現在の状態+ 1(例えば、' State Int'に固定されていると仮定した場合)に渡したいものを考えてください。後続の状態は依然として着信状態と同じであるが、結果は異なる。したがって、結果の引数として 'state + 1'を渡し、継続の新しい状態の引数として' state'を渡す必要があります。 – Cactus

関連する問題