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

cpsMonad形式なんで、渡ってくるfuncはcpsじゃない関数でいいはず(さてこのcallccの型はどうなるでしょう)。

callcallcc
  = callcc id
calcallcc next
  = callcc id next

calcallcc next
  = returnid (\id -> callcc id next)

cpsnextが呼び出されると、そのあとに続くコードnは実行されず、callccの後にきたコードが実行される。