継続と代数的効果
計算の「効果」を制御・抽象化するための一連の概念。λ計算の継続を出発点に、代数的効果やモナドへ広がる。
継続と限定継続
- 継続 (continuation): ある時点での「残りの計算」を第一級の値として表したもの。引数渡しの方式(値呼び・参照呼び・名前呼び・必要呼び)や thunk(遅延値)と関連。
- 限定継続 (delimited continuation): 継続の範囲をデリミタで区切ったもの。
shift/resetなどで効果ハンドラを表現できる。
代数的効果 (Algebraic Effect)
「実行すると値が得られる」計算を型で表し、効果をハンドラで解釈する仕組み。Koka は代数的効果を言語機能として持つ。Scala の ZIO(ZIO[-R, +E, +A] ≈ R => Either[E, A])や Kyo(A < S 形式で IO・Abort・Env を合成)が実用例で、Effect.gen(function*(){ yield* ... }) 風の do 記法で書ける。
モナドによる定式化
- Monad(State モナド等)、Free Monad、Kleisli 圏、Tagless Final(DSL を型クラスで抽象)も効果合成の道具。Scala の cats が代表ライブラリ。
- TypeScript の Effect TS など言語横断の系譜はeffect-tsに詳しい。
関連
- 型の土台はtype-theory-lambda-cube、関連 FP 抽象はoptics-lens。
- 言語横断比較はeffect-ts。
- _moc-prog-lang