実用のための身も蓋もない shift/reset
まず、answer type modification のことは忘れてください。次に実行モデルを思い浮かべて monad を作りましょう。unit
と bind
が必要です。(3/12追記: monad 則にも注意しましょう)最後に
reflect = λm. shift (λk. bind (m, k)) reify = reset . unit
という感じにしましょう。 reflect
という get っとぽいものが裏でこっそり bind
にしてくれています。
おしまい。
普通の monad は最初に unit
して外から bind
で繋いで大きくしていくけど、 shift/reset
を使うと最初に全体を reify
でくるんで中から reflect
で切って(繋ぎ直して)いくイメージ。
なお、Scala の CPS plugin では型推論に失敗します。(ひどい…)
ちなみに answer type modification がある方は、普通の monad じゃなくて indexed monad とかいうのを元にするといいみたいです。(未検証)