代数的演算 (algebraic operations)

副作用を「代数的理論(演算の signature + 等式)の演算」としてモデル化する考え方。Plotkin & Power の理論で、Algebraic Effects の「代数的」が何を指すかの正体。効果が「代数的演算」だからこそ、ハンドラがその「解釈」になり、モナドと繋がる。

演算は「継続を引数に取る」形をしている

各副作用を、結果の続き(継続)を引数に取る演算として書く(generic effects)。

効果演算の型読み
状態 getget : (S → X) → X状態を読んで続きへ渡す
状態 putput : S × X → X状態を書いて続きへ
非決定 choosechoose : X × X → X2つの続きに分岐
例外 raiseraise : X (0引数=空)続きが無い(脱出)

ポイントは演算が計算 X を引数・結果に持つこと。raise が0引数(arity 0)なのは「続きが無い=戻らない」を表す。[effect-handlers|継続の resume 回数]はこの arity と対応する。

「代数的」= 等式で意味を縛る

演算には等式 (algebraic theory) が課される。例えば状態の法則:

get (λs. put s k)        = k                 -- 読んだ値をそのまま書くと無変化
put s (get (λs'. k s'))  = put s (k s)       -- 書いた直後に読むと書いた値
put s (put s' k)         = put s' k          -- 連続 put は最後だけ効く

この等式系(= Lawvere theory / 代数的理論)が「状態とは何か」を意味として定義する。演算 + 等式で代数を作るから「代数的」。

自由モデルとは

理論のモデル(代数) = 台集合 + 各演算の解釈で、課された等式を満たすもの。集合 X 上の自由モデルは、X を葉・演算を節にした項(木)を、課された等式だけで割ったもの。“自由” = 要求された等式以外の同一視を一切しない(余計な関係を勝手に足さない)= 実質「構文そのもの」。

理論生成集合自由モデル
モノイドアルファベット Aリスト [A](連結・単位だけ。ab ≠ ba)
群生成元既約語
代数的効果の理論戻り値 X効果の構文木(get/put/… の木、葉が X)

普遍性(これがハンドラの正体) — X から任意のモデル M への写像 X → M は、自由モデルからの準同型 T X → M に一意に延びる(圏論では「忘却関手の左随伴」)。

→ つまり 戻り値の解釈 X → M + 各演算の解釈(= モデル M)を与えれば、プログラム全体の解釈が一意に決まる。これが ハンドラ = 自由モデルから別モデルへの準同型、ということ。

自由モデル → 自由モナド

効果理論の X 上の自由モデルを、X について関手と見たものが 自由モナド T X(= 副作用プログラムの AST)。だから代数的効果と モナド が理論で繋がる。ハンドラはこの T X から「自由でない」別モデルへ落とす解釈にあたる。

何が代数的に表せるか(線引き)

「代数的」であるには、演算が継続に対して一様(可換)に振る舞う必要がある。

この線引きが「どの副作用が algebraic effects で扱いやすいか」を決めている。

押さえどころ(カード化候補)

関連

Graph