CPSでcallcc
CPS形式では関数はfunc arg1 arg2 ... nextという形式になるので
h (g (f x))
をCPSに変換すると
f x (\vf -> g vf (\vg -> h vg (\vh -> \vh)))
となる(最後はid関数)。
このCPS関数でcallccを実装するとしたら以下のような感じか。
callcc func next = next (func cpsnext) where cpsnext v n = next v
cpsもMonad形式なんで、渡ってくるfuncはcpsじゃない関数でいいはず(さてこのcallccの型はどうなるでしょう)。
callcallcc = callcc id
calcallcc next = callcc id next calcallcc next = returnid (\id -> callcc id next)
cpsnextが呼び出されると、そのあとに続くコードnは実行されず、callccの後にきたコードが実行される。