shift/reset
Olivier Danvy、Andrzej Filinski
shiftとresetという2つの関数
限定継続を扱うために、基本的にセットで使用される
健全かつ完全な公理系が存在する
多相の型システムが存在する
継続渡し形式のプログラムとの間に厳密な対応関係がある
resetで限定継続の区切りを入れる
reset $ \_ -> Mと書いた時、
この式はMと同じだが、継続に区切りを入れている
例えば、3 + 5 * 2 - 1を順番に計算する時、
reset (\_ -> 3 + [5*2]) - 1のようにすれば、
3 + [.]のところまでが限定継続になる
shiftで限定継続を取ってくる
resetの引数内(継続の中)で呼ぶ
shift $ \k -> Mと書いた時、
現在の限定継続を関数kに束縛し、
Mを実行する
直近のresetで区切られた部分を脱出し、代わりにMを実行する
部分継続版のcall/ccのようなものだが、脱出機能が付いているmrsekut.icon
resetとshiftを使った例
reset $ \_ -> 3 + shift (\k -> 5 * 2) - 1だとすると、
現在の限定継続を関数kに束縛し、
∴ k = \x -> 3 + x - 1
Mを実行する
5 * 2
よって結果は10
この例は継続を破棄しているmrsekut.icon
reset $ \_ -> 3 + shift (\k -> 5 * k 2)) - 1だとすると、
現在の限定継続を関数kに束縛し、
∴ k = \x -> 3 + x - 1
Mを実行する
∴ 5 * k 2→5 * (3 + 2 - 1)→20
よって結果は20
参考
『shift/resetプログラミング入門』
#WIP
継続の保存
コルーチンできる
thunkを作る
shift (fun k -> fun () -> k "hello")
global変数っぽく使うことで状態を表現できる
答えの型
resetが返す値の型
shiftを使うと型が変化する
Answer Type
『shift/resetプログラミング入門』3.5
http://www.is.ocha.ac.jp/~asai/cw2011tutorial/main-e.pdf
浅井健一、Oleg Kiselyov
https://homes.luddy.indiana.edu/ccshan/recur/recur.pdf
https://mametter.hatenablog.com/entry/20080417/p2