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は無い

    • HaskellrunST に相当する run 関数で実現している
  • docsにLexical syntaxとLaxical Grammar書いてあって参考になる

参考文献