前文
私は実際にどのように使用するか、ContT
そしてcallCC
何か役に立つものについて頭を悩ませようとしています。コードに関する情報と制御の流れをたどるのに問題があります。(でも、そこが続きのポイントじゃない?)
このモナドといくつかのあまり単純ではないコンビネータを使用してピースを移動するには、さまざまな方法があります。ContT がどのように機能するかについての理解にまだ満足していないことを告白しますが、これまでに読んだことを指摘します。
- Haskell/継続渡しスタイル
- Haskell Cont モナドはどのように、なぜ機能するのですか?
- Haskell callCC の例を理解する
- Haskell での Goto: 継続モナドの使用によるこの一見非常識な効果を説明できる人はいますか?
- HaskellでcallCCを解釈するには?
- Parsec General (私がこの道を歩むきっかけとなった記事)
私がやりたいのは、疑似コードの例を投稿して、それについていくつか質問することです。これは、ContT を使用したコードの典型的な外観を表しています。
疑似コード
type MyMonad r = ContT r (State SomeState)
main = do
runState s_init $ runContT block print
block :: MyMonad r a0
block = do
before_callcc
output <- callCC $ \k -> do
rval <- inner_block
return rval
after_callcc
質問
- の値と型を決定するものは何
output
ですか? - とは
b
どういう意味k
ですか? - 与えられた価値はどこへ
k
行くのか? - いつ
inner_block
実行されますか?どのバージョンの状態が表示されますか? - どこに
rval
行き、そのタイプは何ですか? k
との関係は何rval
ですか?k
a) ininner_block
、b) inafter_callcc
、c) outside ofを適用するとどうなりblock
ますか?- 上記のそれぞれの状態のバージョンは何ですか?
k
から抜け出すにはどうすればいいblock
ですか?- 州に入れ
k
ますか?
読みやすいように色分けされています