実用のための身も蓋もない shift/reset

まず、answer type modification のことは忘れてください。次に実行モデルを思い浮かべて monad を作りましょう。unitbind が必要です。(3/12追記: monad 則にも注意しましょう)最後に

reflect = λm. shift (λk. bind (m, k))
reify = reset . unit

という感じにしましょう。 reflect という get っとぽいものが裏でこっそり bind にしてくれています。 おしまい。

普通の monad は最初に unit して外から bind で繋いで大きくしていくけど、 shift/reset を使うと最初に全体を reify でくるんで中から reflect で切って(繋ぎ直して)いくイメージ。

なお、ScalaCPS plugin では型推論に失敗します。(ひどい…)

ちなみに answer type modification がある方は、普通の monad じゃなくて indexed monad とかいうのを元にするといいみたいです。(未検証)