Koka
- どうやら効果(ko-ka)から来ているらしい
- Algebraic Effect がある言語
Tour
- dot selection
encode(s, 3)はs.encode(3)と書ける
- Kotlin みたいにtrailing lambdaは外に出せる
3.2 Effect Types
- 関数内の副作用を推論できる
fun square1( x : int ) : total int { x*x }
fun square2( x : int ) : console int { println( "effect" ); x*x }
fun square3( x : int ) : div int { x * square3( x ) }
fun square4( x : int ) : exn int { throw( "oops" ); x*x }total: 副作用が無いexn: 例外を発生させるdiv: 関数が終了しないndet: 非決定的io: ヒープioが出来てexn+ndef+div
docs, ホバーすると型と定義場所出て良い
fun square6( x : int ) : _e int
println("")
x*x_eでeffect implicitに書ける<div,exn>のように組み合わせて書けるalias pure = <div,exn>
map : (xs : list<a>, f : (a) -> e b) -> e list<b>- 効果を付け足すのは
<div|e>みたいに書ける - ex.
while関数
while : ( pred : () -> <div|e> bool, action : () -> <div|e> () ) -> <div|e> ()3.2.4 Local Mutable Variables
fun fib(n : int) : div int
if n <= 0 then 0
elif n == 1 then 1
else fib(n - 1) + fib(n - 2)まだ賢くないので無限ループしないことを保証できないので div つく
3.2.5 Reference Cells and Isolated state
-
val r = ref(0)でheap上の可変参照もらえる!rでderef
-
read:
read<h>effect -
write:
write<h>effect -
stateful
st<h>= read + write -
関数内部のeffectが外に漏れることはないので
fib3の effectは無い- Haskell の
runSTに相当するrun関数で実現している
- Haskell の
-
docsにLexical syntaxとLaxical Grammar書いてあって参考になる