TL;DR

  • call/cc は残りの計算すべてを捕捉してしまうので、代わりに限定継続を使うとよい。
  • 継続渡しスタイルは、最適化しやすい中間表現としても使われる。エフェクトのハンドリングやモナドにも継続が現れる。

内容

call/cc と限定継続

Racket の call/cc は、呼び出したフォームの中に閉じず、残りの計算すべてを捕捉してしまう。そのため、代わりに限定継続を使うとよい。限定継続で call/cc やモナドを実装でき、その逆もできる。

中間表現としての CPS

継続渡しスタイル(CPS)を中間表現(IR)として採用する処理系もある。例えば SML/NJ、Scheme、OCaml、WebAssembly である。CPS は関数を第一級オブジェクトとして扱うので、関数型言語と相性がよい。また CPS では束縛が単一代入的なので、β 簡約や η 簡約などで多様な最適化を実装しやすい。発表では、手続き型言語と関数型言語の制御の移譲(control transfer)の対応付けも紹介された。

エフェクトと継続

エフェクトのハンドリングとは、どのような副作用(Effect)が起きたか、そしていつどのように再開するかを扱うことであり、いつどのように再開するかが継続にあたる。モナドにも継続は現れる。

Algebraic Effect Handlers は、副作用のある計算を扱う新しい手法で、モナド変換子よりもモジュール化や合成がしやすいらしい。

キーワード

自分の理解

自分の知識では一部しか理解できなかった…。特に Algebraic Effect Handlers のあたりはよく分からなかった。

関連