私は継続通行と通話継続通話を理解しようとしています。このページ1として 次のようにCC法を用い https://en.wikipedia.org/wiki/Monad_(functional_programming)#Continuation_monadコールが実装されている:現在の継続で呼び出しても、それ自体の継続を無視しますか?
call_cc :: ((a -> (b -> r) -> r) -> (a -> r) -> r) -> (a -> r) -> r
call_cc f k = f (\t x -> k t) k
このsignatureとimplementationにより説明したように。
しかし、x
パラメータはここでは使用されないことがわかります。 f
に渡された継続が常に無視されることを意味しますか?最初の継続k
は常にそれを置き換えていますか? その場合、call-with-cc
は1レベルの深さではなくそれ以上の関数を呼び出すことができるという意味ですか? (通常の制御フローで呼び出される次の関数は、継続すると、x
は無視されます)
その場合は非常に制限されているように見えますが、実際にはどのような使用ですか?
ありがとうございます! その例:https://en.wikibooks.org/wiki/Haskell/Continuation_passing_style#Deciding_when_to_use_k これは、以前の連絡先(現在の連絡先)に戻り、返信($ y - 4を表示) "はy-4を表示してプログラムを終了しますか? – lezebulon
@lezebulon 'callC'ed' do'ブロックで 'k'を呼び出すと、この呼び出し後のすべてのアクションは完全に無視されます。だから 'return(show $ y - 4)'は 'y> 20'の条件が' False'の場合にのみ実行されます – Odomontois
yesしかし、呼び出されたときに何を返すのですか?それはkと同じですか? – lezebulon