限定継続 in Haskell 98 by Oleg Kiselyov

限定継続フェスタ があると聞きまして,私もちょっぴり勉強しています。 Schemeには馴れていないし、僕のPCには処理系も入ってないので、Haskellでやります。

Olegさんの投稿 (http://www.mail-archive.com/haskell@haskell.org/msg20758.html ) から、Haskll98で動作する 限定継続の実装が手に入ります。浅井先生・亀山先生の型システムを実装したものらしいです。

細かいことはわかりませんが、モナドはわかるのでためしてみます。

$ ghci ShiftResetGenuine.hs 
   ___         ___ _
  / _ \ /\  /\/ __(_)
 / /_\// /_/ / /  | |      GHC Interactive, version 6.6, for Haskell 98.
/ /_\\/ __  / /___| |      http://www.haskell.org/ghc/
\____/\/ /_/\____/|_|      Type :? for help.

Loading package base ... linking ... done.
[1 of 1] Compiling ShiftResetGenuine ( ShiftResetGenuine.hs, interpreted )
Ok, modules loaded: ShiftResetGenuine.
*ShiftResetGenuine> flip unC id (reset (ret 1 `bind` (\x-> shift (\k->ret 2) `bind` (\y-> ret (x+y)))))
2
*ShiftResetGenuine> flip unC id (reset (ret 1 `bind` (\x-> shift (\k->k 2) `bind` (\y-> ret (x+y)))))
3
*ShiftResetGenuine> 

素晴らしい。何が素晴らしいって、ちゃんと型推論がはたらく事です。

GHCrebindable syntaxの機能を使えば do記法でも書けそうだ。