Effの論文を読みながら動かしてAlgebraic Effectを理解したい
後で消すmrsekut.icon
各ノートにまとめようmrsekut.icon
『An Introduction to Algebraic Effects and Handlers』
Algebraic Effects and Handlers
Eff
Effect System
#??
そもそも「Effect」ってなに #??
副作用(side effect)のことかmrsekut.icon
どこから入門すればよいのかわからない
handlerは、抽象化のおかげで同じシンタックスで扱えるのが嬉しいってことなのか?mrsekut.icon
モナド的な
どこが一番の押しなの?
読みmemo
代数効果は純粋でない操作による振る舞いを扱う
配列のset/get命令とか
IOとか
例外とか
handlerを利用することで上のことに加えてさらに色々できるようになる
stream redirection
backtraking
協調マルチスレッド
I keep hearing from people that they are interested in algebraic effects and handlers, but do not know where to start.
めっちゃ、俺じゃん
p.2上に構文木がある
handler hとcomputation cがある点が特異
do x ← c1 in c2はイメージ通り
op(v; y. c)
関数の実行みたいな感じかmrsekut.icon
vは仮引数
opがeffectを実行して、その結果をyに束縛
その後、継続であるcを再開する
generitic effect
上のop命令の代わりに、同名の関数opを定義する
op = fun x -> op(x; y. return y
右辺に出てくるopはop命令のop
左辺は今定義した関数名
本来は、6 + xみたいな式は書けない(?)
これは((+) 6) xという意味だが、これは2回の関数適用をしている
つまり1回目の関数適用(+) 6によって既にコレはcomputationになっているので、それ xみたいなことができない
なので代わりにこう書く
code:a
do f <- (+) 6
in f x
が、これは冗長なので、普通に(+) 6 xと書けるものとして話をすすめる
computation全体はtreeと考えられる
葉はvalue、節はoperation
valueというのは、演算後の結果である値という意味だよなmrsekut.icon
p.3中盤の図がわかりやすい
なるほどmrsekut.icon*4
computationというプログラム全体はツリー構造であり、条件分岐などによって枝が別れていく
前の関数の戻り値が、次の関数の入力となる
たぶん。書かれてはないmrsekut.icon
戻り値がbooleanな関数ならそこの分岐は2通りのみだし、戻り値がintな関数ならば、枝は無限に分かれることになる
再帰がある場合はラベルをつけてごにょごにょするらしい
詳しくは6.3に書く、とある
2 Exampleから読む
動かしmemo
変数も関数も全く同じlet hoge ~~~で定義する
コレは良いmrsekut.icon
Hytlでもこうしようと思ってた
自作のshape型の変数を定義
code:eff
let a = Circle 9.
パターンマッチを使った関数定義
code:eff
let perimeter = match shape with
| Circle r -> 2.0 *. 3.14159 *. r
| Rectangle (w, h) -> 2.0 *. (w +. h)
code:eff
let perimeter = function
| Circle r -> 2.0 *. 3.14159 *. r
| Rectangle (w, h) -> 2.0 *. (w +. h)
このfunctionに当たる部分が糖衣構文だったりなんなりらしい
例えばfunctionの代わりにhandlerがある
code:eff
let always_zero = handler
| effect Random k -> continue k 0
| val x -> x
performってなんだmrsekut.icon
パターンマッチのところで
code:eff
| effect Effect k -> ..
と書くことで、継続を渡せる。kは継続
その後、
code:eff
continue k
とすることで、継続を実行できる