Slide 1

Slide 1 text

霧の中の代数的エフェクト ~代数的とは何なのか~

Slide 2

Slide 2 text

自己紹介 名前: funnycat やってること: PureScriptやHaskellでモックライブラリを作ったり、zenn.devで記事を書いたりし てます。 この発表までの変遷: 1. 関数型言語でフロントエンドをやりたくてElmを学ぶ。 2. PureScriptを始める。モナドの理解以前にExtensible Effectsに突っ込み撃沈。  諦めてモナド→MTL→Extensible Effectsと進む。 3. 他言語のExtensible Effectsを知るためHaskellを始める。 4. 代数的エフェクトの存在を知る。色々言語を触る。 5. 代数的ってなんだ?という記事を書こうと思って真面目に調べ始めて撃沈。霧の中。 6. 多少見えてきたものがあるので話してみようと思う。

Slide 3

Slide 3 text

ご注意 ● 理論的な内容に触れますが、私自身にアカデミックなバックグラウンドはない。 厳密性を欠いている可能性があります。 ● 人物名は敬称略とさせていただきます。 ● 代数的エフェクトは今も進化を続けていますが、この発表では提唱者による限定的 な範囲の代数的エフェクトについて話します。

Slide 4

Slide 4 text

はじめに

Slide 5

Slide 5 text

代数的エフェクトとハンドラー の ざっくりとした説明 (あとで厳密な説明を書きます)

Slide 6

Slide 6 text

ラベルづけ この発表は、異なる複数のレイヤーの話が混在しており、話している内容の属するレイヤーが切 り替わりながら進行します。 現在どのレイヤーの話をしているかを視覚的にぱっと把握できるようにするため、スライド右上 に以下のラベルを付けています。 [理論] 数学的な構造の話 [橋渡し] 理論とプログラムの見え方をつなぐ話 [プログラム] Koka / Haskell 上での見え方 [注意] 誤解しやすいズレや境界線 [整理] まとめ・地図・章の接続

Slide 7

Slide 7 text

代数的エフェクトとは? 今の段階では、代数的エフェクトを    『operation によって計算エフェクトを表現したもの』 としておきます。 (operation の例: ask, get, set, choose) operation は具体的な処理を行いません。 計算エフェクトを表現するものとしては、他には『モナド』がありますね。 【橋渡し】

Slide 8

Slide 8 text

ハンドラーとは エフェクトの operation を利用する関数を書いたとします。 しかし operation とは具体的な処理を行わないものでした。 その operation に対して具体的な処理を与えるものがハンドラーです。 つまり実際のプログラミングにおいては、代数的エフェクトとハンドラーは一緒に扱われ ます。 同じ operation の組み合わせに対し、ハンドラーを差し替えることで別々の処理を行うこ とができます(本番とテストで処理を切り替えるとか)。 【橋渡し】

Slide 9

Slide 9 text

具体的なコードを用いたサンプル

Slide 10

Slide 10 text

扱うサンプルコード ● 状態を表現するエフェクト State ● State が持つ operation ○ 値を取得する ○ 値を書き換える ● Stateエフェクトを使うサンプル関数の内容 ○ 数値を扱う State とする。 ○ 処理内容は以下とする。 1. 数値を取得する。 2. 取得した数値を加算して値を書き換える。 3. 再度数値を取得する。 4. 1と3で取得した値のタプルを返す。 ● State のハンドラー ○ 極力余計なことをしないシンプルなものとする ※後ほど別の言語の例も示しますが、表現する内容はまったく同じものとします。 【プログラム】

Slide 11

Slide 11 text

Koka のコード

Slide 12

Slide 12 text

State エフェクトの宣言 任意の型sを扱えるエフェクトとし、 get,set の operation を宣言している。 【プログラム】

Slide 13

Slide 13 text

サンプル関数 【プログラム】

Slide 14

Slide 14 text

ハンドラー 【プログラム】

Slide 15

Slide 15 text

実行例 【プログラム】

Slide 16

Slide 16 text

ここまではざっくり ここからはガチ

Slide 17

Slide 17 text

コードを見てきたわけですが

Slide 18

Slide 18 text

コードのどこに『代数』がありましたか?

Slide 19

Slide 19 text

まだ見えていない

Slide 20

Slide 20 text

ということで・・・・・・

Slide 21

Slide 21 text

提唱者による説明を見てみよう 代数的エフェクトの論文の内容で、代数的エフェクトについて 説明されている箇所をいくつかピックアップしてわっと見ていき ます。 ここは登場する概念をさらうためのセクションであり、すべての 理解は目指しません。

Slide 22

Slide 22 text

代数的エフェクトとは [GORDON D. PLOTKIN AND MATIJA PRETNAR 2013] HANDLING ALGEBRAIC EFFECTS 代数的エフェクトとは、対象としているエフェクトを生み出す operation をもつ等式理論によって表現できる計算 エフェクトである。この理論の自由モデルは、対応するエフェクトに期待される計算モナドを誘導する。 【理論】

Slide 23

Slide 23 text

代数的エフェクトとは 集合 A から値を返す計算は、等式理論によって生成される自由モデル F A の要素としてモデル化される。非 決 定性の場合、これらの等式は choose が半束演算であることを述べる。忘却関手を別にすれば、自由モデル関 手は、対応する効果をモデル化するために Moggi が提案したモナドそのものである。そのような等式的提示に よってモナドが得られる効果を algebraic と呼ぶ。対応するモナドはちょうど ranked monads である。 [GORDON D. PLOTKIN AND MATIJA PRETNAR 2013] HANDLING ALGEBRAIC EFFECTS 【理論】

Slide 24

Slide 24 text

代数的エフェクトとは [Gordon Plotkin and John Power 2002] Notions of Computation Determine Monads この論文の立場は、計算エフェクトはモナドを決定するが、モナドと同一視されるものではない、というものであ る。われわれは、計算エフェクトは演算の族によって実現され、その等式理論によってモナドが生成されると考 える。 【理論】

Slide 25

Slide 25 text

代数的エフェクトとは [Gordon Plotkin and John Power 2002] Notions of Computation Determine Monads 【理論】

Slide 26

Slide 26 text

代数的エフェクトとは 【理論】 [Gordon Plotkin and John Power 2002] Notions of Computation Determine Monads

Slide 27

Slide 27 text

代数的エフェクトとは [Gordon Plotkin and John Power 2003] Algebraic Operations and Generic Effects 【理論】

Slide 28

Slide 28 text

代数的エフェクトとは 【理論】

Slide 29

Slide 29 text

まとめてみると 代数的エフェクトは、計算エフェクトの一種である。 Plotkin–Power の見方では、計算エフェクトは次の二つによって表現される。 ・効果の発生源を表す operation の集合 ・それらの operation の性質を記述する等式理論 この等式理論から、値集合 A 上の自由モデル F A が構成される。 A の値を返す計算は、この自由モデル F A の要素としてモデル化される。 さらに、自由モデル関手 F と忘却関手 U から得られるモナド U F が、対応するエフェクトを表す計算モナドになる。 このように、等式的提示から計算モナドが得られるエフェクトを algebraic と呼ぶ。 ただし、この立場では、計算エフェクトはモナドを決定するが、計算エフェクトそのものをモナドと同一視するわけではない。 【理論】【補足】

Slide 30

Slide 30 text

「代数的」には、もう一つの使い方がある ここまで見ているのは、 計算エフェクトが 代数的 である という話です。 一方、文献では、 operation そのものが 代数的 である という別の使い方もあります。 この二つは関係していますが、同じ定義ではありません。 operation が代数的であるとはどういうことかは、本発表では割愛します。 【理論】【補足】

Slide 31

Slide 31 text

計算エフェクト ・代数的エフェクト 代数的エフェクトを表すもの ・operation ・等式 ・等式理論 / 等式的提示 等式理論から作られるもの ・モデル ・自由モデル ・自由モデル関手 F ・忘却関手 U ・モナド UF 意味論上の対応 ・値を返す計算 = 自由モデルの要素 ・計算モナド = UF 登場した要素の整理 馴染みのない言葉が並んでいるかもしれません が、前述の通り今回完全理解は目指しません。 【整理】

Slide 32

Slide 32 text

なぜ代数的エフェクトが考えられたのか 登場の流れ

Slide 33

Slide 33 text

Moggi

Slide 34

Slide 34 text

Moggi はどう考えたか [EUGENIO MOGGI] Notions of Computation and Monads 【理論】

Slide 35

Slide 35 text

Plotkin, Power

Slide 36

Slide 36 text

Plotkin, Power [Gordon Plotkin and John Power 2002] Notions of Computation Determine Monads Moggiのモデル化への統一的なアプローチは、例えば関数型プログラミングにおいて有用であることが証明さ れています。 しかし、様々なエフェクトを比較し対照するための精密な数学的基礎がありませんでした。 【理論】

Slide 37

Slide 37 text

Plotkin, Power [Gordon Plotkin and John Power 2003] Algebraic Operations and Generic Effects 【理論】

Slide 38

Slide 38 text

Plotkin, Power [Gordon Plotkin and John Power 2003] Algebraic Operations and Generic Effects 【理論】

Slide 39

Slide 39 text

まとめ 計算エフェクトの表現方法 ● Moggi は、計算エフェクトを対応するモナドによってモデル化した。 ● Plotkin–Power らは、計算エフェクトを operation と等式から見る。 両者は対立しているわけではない。 ● Moggi の見方では、計算エフェクトに対応するモナドを考える。 ● Plotkin–Power らの見方では、まず計算エフェクトを実現する operation と、その 性質を表す等式を考える。 そして、その等式理論からモナドが生成される。 つまり、どちらもモナドに到達するが、代数的エフェクトの見方では、モナドは operation と等式から結果として現れる。 【整理】

Slide 40

Slide 40 text

計算エフェクトを operation と等式で見る、という方向 が代数的エフェクトの理論につながる。 ということで、operation を持つという等式理論などを 見ていく。 【整理】

Slide 41

Slide 41 text

等式理論とは 【理論】

Slide 42

Slide 42 text

等式理論とは 【Adámek, J., Rosicky, J. and Vitale, E. M. (draft) Algebraic Theories による等式理論の定義】  ※書籍のドラフト版(以前無料で公開されていた) 【代数的エフェクトの説明】 代数的エフェクトとは、対象としているエフェクトを生み出す operation をもつ等式理論 によって表現できる計算 エフェクトである。この理論の自由モデルは、対応するエフェクトに期待される計算モナドを誘導する。 専門性の高い用語のオンパレードになっているので、ざっくり説明していきます。 【理論】

Slide 43

Slide 43 text

これを軸に 説明します 【理論】

Slide 44

Slide 44 text

いくぞ!

Slide 45

Slide 45 text

まずは です 【理論】

Slide 46

Slide 46 text

Σ 【余談】 テキストの流れでは、プログラムでいう単一の型のみを考え るところから定義して、後から複数の型を扱えるように拡張し ていきます。 【理論】

Slide 47

Slide 47 text

get / set は木の中でどう見えるか Koka のコード上では、 get と set は次のように見えます。 get: 値を渡さずに呼び出す。 結果として、現在の状態値を受け取る。 set(s): 新しい状態値 s を渡して呼び出す。 結果として、特に意味のある値は返さない。 しかし、木として見ると、注目する場所が少し変わります。 get は、結果として得られる状態値によって、次の計算が分かれます。 たとえば状態が整数なら、 ・0 が得られた場合の次の計算 ・1 が得られた場合の次の計算 ・2 が得られた場合の次の計算 ・… という枝を持つように見えます。 一方、set(s) は、状態値 s を記録したあと、次の計算へ一本道で進むように見えます。 【理論】

Slide 48

Slide 48 text

Σ-項、Σ-木 【理論】

Slide 49

Slide 49 text

コードとΣ-木のイメージ get / set という operation 記号に注目して描いた Σ-木。 get は状態値ごとに分岐するため、 state では int の値 の数だけ枝がある。 ここではまだ具体的な state の意味は考えず、operation の つながりだけを描いている。 【橋渡し】

Slide 50

Slide 50 text

次は です 【理論】

Slide 51

Slide 51 text

E は、Σ-項同士の等式の集合です。 【理論】

Slide 52

Slide 52 text

等式を書いてみる(ここでの記法) ここでの `return a` は、Koka の構文そのものではなく、 Σ-木の葉を表すための記法です。 `return a` 値 `a` を返して計算が終わる葉を表す。 `get(s -> T_s)` `get` によって得られる状態値を `s` とし、その値に応じて次の項 `T_s` へ進む。 `set(s); T` `set(s)` を行い、その後に項 `T` へ進む。 【理論】

Slide 53

Slide 53 text

State effect は get / set という operation だけ でなく、それらが満たすべき law によって特徴づ けられる。 【理論】

Slide 54

Slide 54 text

KokaのStateでの等式(擬似コード) この記法で、State の代表的な law は次のように書けます。 1. get した値をそのまま set し直すなら、何もしないのと同じ。 `get(s -> set(s); return ()) = return ()` 2. set を二回続けると、最後の set だけが残る。 `set(s); set(t); return v = set(t); return v` 3. set の直後に get すると、set した値が得られる。 `set(s); get(x -> return x) = set(s); return s` 4. 状態を変えずに get を二回行うと、同じ値が得られる。 `get(s -> get(t -> return (s,t))) = get(s -> return (s,s))` 5. 4 の具体例として、2回 get した値を使って set する場合。 `get(s -> get(t -> set(s + t); return (s,t))) = get(s -> set(s + s); return (s,s))` 【橋渡し】 ※これは厳密な公理リストではなく、直感を掴むための代表例です

Slide 55

Slide 55 text

実際のプログラミング言語における等式 等式理論としては等式が求められるが、これらの等式が必ずしもそのままプログラミング言語の機能 として要求されるわけではない。 Koka では get / set という operation と、それを解釈する handler は書ける。 しかし、その handler が State law を満たすかどうかは、処理系が一般に証明してくれるわけではな い。 必要なら、仕様やテストとして確認することになる。 【橋渡し】

Slide 56

Slide 56 text

KokaのStateでの等式(テスト) 【プログラム】

Slide 57

Slide 57 text

KokaのStateでの等式(テスト) これらのテストは、 run-state handler が State law に沿って振る舞っているかを確認している。 ただし、これは言語が等式を強制しているという意味ではない。 ここで確認しているのは、あくまでこの handler 実装が、期待される State の振る舞いを満たしているかどうかである。 【プログラム】

Slide 58

Slide 58 text

Σ-木と等式 等式を入れると、別々の Σ-木を「同じ計算」とみなせるようになる。 ただし今回は、この商構成の詳細には踏み込まない。 【橋渡し】

Slide 59

Slide 59 text

理論側: operation + 等式でエフェクトを特徴づける 実用言語側: operation + handler は書ける 等式は多くの場合、処理系が直接扱わない ここでのまとめ 【整理】

Slide 60

Slide 60 text

ここまできた 代数的エフェクトとは、対象としているエフェクトを生み出す operation をもつ等式理論 によって表現できる計算 エフェクトである。この理論の自由モデルは、対応するエフェクトに期待される計算モナドを誘導する。 次は「この理論の自由モデルは、対応するエフェクトに期待される計算モナドを誘導する。 」 【整理】

Slide 61

Slide 61 text

この理論の自由モデルは、対応するエフェクトに 期待される計算モナドを誘導する。 【理論】

Slide 62

Slide 62 text

自由モデル⇛モナドまでの道のり この対応について簡単に説明するのは困難なため、以下の道筋で説明します。 1. ゴールの確認 どういう条件を満たせばモナドが誘導できたといえるのか 2. スタートの確認 そもそも自由モデルとは何なのか 3. スタートからゴールまで 自由モデルから出発して、どのようにモナドが誘導されるか 【整理】

Slide 63

Slide 63 text

ここでお詫び

Slide 64

Slide 64 text

圏論の話をまったく出さないで説明をした かったけど無理でした。。。 よって圏論の話を頑張ってします。

Slide 65

Slide 65 text

予備知識

Slide 66

Slide 66 text

ここで説明する基本的な概念 ● 圏 ● 関手 ● 自然変換 ● 随伴 ● モナド ※主目的から外れるため、あまり厳密には説明しません。  ざっくりな説明になることをご容赦ください。  深い意味を考えず記号の形を視覚的に見ていくのがよいかもしれません。 【整理】

Slide 67

Slide 67 text

圏は、対象と射からなり、射の合成と恒等射を備えた構造である。 ただし、射の合成について結合則と単位則が成り立つ。 圏 圏の例 【理論】 【ざっくり説明】 圏は、対象と、その対象どうしを結ぶ射を集めたも のです。 射は続けて合成できます。

Slide 68

Slide 68 text

圏  圏   は、集合を対象とし、集合間の写像を射とする圏である。 の中の一部の例 ※恒等射は省略 【理論】

Slide 69

Slide 69 text

関手 関手の例 ※恒等射やその対応および合成などは省略 【理論】 【ざっくり説明】 関手は、ある圏の対象と射を、別の圏の 対象と射へ対応させるものです。

Slide 70

Slide 70 text

関手 Maybe 先ほどのSetの例の一部を再利用し、Haskellなどで馴染みのある Maybe を関手とした 例。 【理論】

Slide 71

Slide 71 text

自然変換 ※このような図式を可換図式という 【理論】 【ざっくり説明】 自然変換は、二つの関手の間の対応です。 各対象について、一方の関手で写した結果から、 もう一方の関手で写した結果への射を与えます。

Slide 72

Slide 72 text

自然変換の例 以下の図は、先ほどのSetの例と関手の例を再利用し、List関手とMaybe関手の間の自 然変換の例としたもの。 【理論】

Slide 73

Slide 73 text

モナド ※可換図式 【理論】 【ざっくり説明】 モナドは、一つの圏から同じ圏への関手に、 値をその構造へ入れる自然変換と、二重になった構造 を一重にする自然変換を備えたものです。

Slide 74

Slide 74 text

随伴にあらわれる単位・余単位 単位・余単位の形 【理論】 【ざっくり説明】 単位:元の対象を、二つの関手を順に適 用した対象へ入れるもの。 余単位:二つの関手を逆の順に適用し た対象を、元の対象へ戻すもの。

Slide 75

Slide 75 text

随伴 【理論】 【ざっくり説明】 二つの関手が、 単位と余単位を通して うまく対応している関係。

Slide 76

Slide 76 text

随伴からモナドが得られる 【理論】

Slide 77

Slide 77 text

随伴からモナドが得られる 【理論】

Slide 78

Slide 78 text

随伴からモナドが得られる 【理論】

Slide 79

Slide 79 text

「随伴からモナドが得られる」のまとめ図 【理論】 ※T=GFとしている

Slide 80

Slide 80 text

関係しそうな箇所を抽出 [GORDON D. PLOTKIN AND MATIJA PRETNAR 2013] HANDLING ALGEBRAIC EFFECTS 【理論】

Slide 81

Slide 81 text

モナドを誘導する箇所の説明で登場した要素たち 【理論】

Slide 82

Slide 82 text

関手が二つ (自由モデル関手と忘却関手)

Slide 83

Slide 83 text

ひょっとして随伴?💡 ・・・・・・そうです。随伴です。

Slide 84

Slide 84 text

答えは書いてあった [Gordon Plotkin and John Power 2002] Notions of Computation Determine Monads 【理論】

Slide 85

Slide 85 text

忘却関手と自由関手とは 【理論】

Slide 86

Slide 86 text

随伴とモナドの図に当てはめてみる 【理論】

Slide 87

Slide 87 text

2013年論文では Set で見る 【理論】

Slide 88

Slide 88 text

エフェクト理論 【理論】

Slide 89

Slide 89 text

モデルの圏 【理論】

Slide 90

Slide 90 text

自由モデルの随伴から計算モナドへ 【理論】

Slide 91

Slide 91 text

State の自由モデル    の中身 【橋渡し】

Slide 92

Slide 92 text

注釈を加えたもの 【橋渡し】

Slide 93

Slide 93 text

プログラムとの対応 【橋渡し】

Slide 94

Slide 94 text

ここで大事なこと ここで大事なのは、Moggi の モナド を最初から仮定するのではなく、operation / 等式 から モナド が現れるということ。 ※ 厳密には、自由モデル関手と忘却関手からモナドが得られる(圏論的な話)。 【理論】

Slide 95

Slide 95 text

ここまでで省略したもの 【注意】

Slide 96

Slide 96 text

代数的ではないエフェクト:継続 【注意】

Slide 97

Slide 97 text

operation の木をデータ型として露出させる:フ リーモナド on Haskell 【プログラム】

Slide 98

Slide 98 text

素朴なフリーモナド 【プログラム】

Slide 99

Slide 99 text

State エフェクト これらは、最初のKokaのサンプルと同じ ことをするコードです。 【プログラム】

Slide 100

Slide 100 text

example の get, set を展開すると・・・・・・ このような入れ子構造になる 【プログラム】

Slide 101

Slide 101 text

木構造として見ると 【橋渡し】

Slide 102

Slide 102 text

ちょっと加工してやると Op を消し、Pure を return に読み替えた木 Koka の例の木 Haskellの方はデータ構造で表すために Op が存在していたが、消してやり、Pure を return に読み替えると、Koka の場合の木と同じ構造になった。 【橋渡し】

Slide 103

Slide 103 text

同じ operation 木に見えるが、少し違う フリーモナドでは、operation の木をそのままデータとして持ちます。 そのため、形の違う二つの木は、別のデータです。 一方、自由モデルでは、 operation 木を等式まで含めて見ます。 そのため、等式によって同じとされる木は、区別されません。 たとえば State の等式により、  set(s₁); set(s₂); return a と  set(s₂); return a が同じとされるなら、 Free monad では形の違う二つの木ですが、 自由モデルでは同じ計算として扱われます。 【注意】【橋渡し】

Slide 104

Slide 104 text

handler 【理論】

Slide 105

Slide 105 text

ハンドラーの説明 等式理論のモデルとは、解釈、すなわち、等式を満たす一つの集合と、各演算に一つずつ対応する写像 の集合である。ハンドラーは、そのような解釈の定義を与える。 【理論】 主な考えは、次の二点である。(1)ハンドラーは、等式理論の、必ずしも自由ではないモデルに対応す る。そして(2)ハンドリングの意味論は、そのようなモデルを対象とし、自由モデルの普遍性によって誘導 される一意な準同型を用いて与えられる。

Slide 106

Slide 106 text

未処理計算をどう実行するのか 【整理】

Slide 107

Slide 107 text

コードとΣ-木のイメージ handler は、この operation 木を評価するものとして見られます。 【橋渡し】

Slide 108

Slide 108 text

論文の答え:handler はモデル、handling は準同型 主な考えは、次の二点である。 (1)ハンドラーは、等式理論の、必ずしも自由ではないモデルに対応する。そして (2)ハンドリングの意味論は、そのようなモデルを対象とし、自由モデルの普遍性によって誘導される一意な準同型を用いて 与えられる。 つまり 未処理計算: 自由モデルの側にある handler: 別のモデルを与える handling: handling とは、自由モデルの計算を、       handler が与えるモデルの世界へ移して評価することだと見られる。 です。 ここで、さきほど出てきた自由モデル F(A) が再び効いてきます。 【理論】【橋渡し】

Slide 109

Slide 109 text

handler は、どうモデルに対応するのか 【理論】【橋渡し】

Slide 110

Slide 110 text

同じ operation、異なる解釈 【理論】【橋渡し】

Slide 111

Slide 111 text

operation だけでは、木全体はまだ読めない 自由モデルの計算は、 operation 木として見ていました。 operation 木には、二種類の部分があります。 ● 内部のノード: get や set ● 葉: return a 前のスライドでは、 handler に書かれた get と set の処理が、 各 operation の解釈を与えると見ました。 しかし、それだけでは operation 木全体を処理できません。 return a という葉に到達したとき、そこにある値 a を、handler でどのように扱うかも決める必要があります。 したがって、handling には次の二つが必要です。 ● get と set のノードをどう処理するか ● return a の葉にある値をどう扱うか この二つが決まることで、 operation 木全体の処理が決まります。 【理論】【橋渡し】

Slide 112

Slide 112 text

葉の値をどう扱うか 【理論】【橋渡し】

Slide 113

Slide 113 text

get のノードをどう扱うか 【理論】【橋渡し】

Slide 114

Slide 114 text

set(s) のノードをどう扱うか 【理論】【橋渡し】

Slide 115

Slide 115 text

葉とノードの処理を、木全体へ広げる 【理論】【橋渡し】

Slide 116

Slide 116 text

木全体の処理を、一つの写像として表す 【理論】【橋渡し】

Slide 117

Slide 117 text

handling は operation の解釈を保つ 【理論】【橋渡し】

Slide 118

Slide 118 text

葉の扱いは、木全体の handling に一意に延長される 【理論】【橋渡し】

Slide 119

Slide 119 text

図解

Slide 120

Slide 120 text

Koka の handler と対応させる 【橋渡し】

Slide 121

Slide 121 text

example を処理してみる 【橋渡し】

Slide 122

Slide 122 text

ただし:handler が常に正しいとは限らない 【橋渡し】

Slide 123

Slide 123 text

ここまでのまとめ 【注意】

Slide 124

Slide 124 text

実用言語では 等式 がどこへ行ったのか

Slide 125

Slide 125 text

実用言語では 等式 はどこへ行ったのか 理論上は、operation だけでなく 等式 まで含めて エフェクト理論 を見る。 しかし実用言語では、多くの場合、operation と handler は書けても、 等式 は言語機能として直接は書かない。 そのため、handler が期待する law を満たすかどうかは、 型システムではなく、仕様・設計・テスト・証明の側に残る。 【整理】

Slide 126

Slide 126 text

エフェクトの合成

Slide 127

Slide 127 text

エフェクトの合成 実用言語では、複数のエフェクトを同時に扱えることが重要です。 State Exception Nondeterminism I/O などを組み合わせて使いたくなりますし、Kokaなども実際そのように使えます。 以下は ask エフェクトを定義し、同時に扱う例 【整理】

Slide 128

Slide 128 text

エフェクトの合成 Koka に限らず、代数的エフェクトを扱えるとされている言語は大抵エフェクトを合成できるため、  代数的エフェクト = effect を簡単に合成する仕組み という印象を持つかもしれません。 しかし、今回見てきた提唱者側の基本構図は、一つのエフェクト理論についての話でした。 つまり、  一つの エフェクト を operation / 等式 から見る という構図であって、合成は中心には出てきませんでした。 複数のエフェクトをどう組み合わせるかは、この基本構図の外側にある話です。 【整理】

Slide 129

Slide 129 text

実用する上では合成は不可欠 前述の通り実用上はエフェクトの合成は避けて通れません。 たとえば、実際のプログラムでは、 状態を読み書きしながら 例外を投げ ログを書き 外部 I/O も行う ということが普通に起きます。 そのため、実用言語では複数のエフェクトを扱える仕組みが重要になります。 合成は、代数的エフェクトの出発点ではありません。 しかし、実用上はすぐに必要になるテーマです。 【整理】

Slide 130

Slide 130 text

operation / 等式で見ると、合成も見えてくる operation / 等式 でエフェクトを見ると、複数のエフェクトを組み合わせる問題も、同じ言葉で考えられます。 たとえば直感的には、  State の operation / 等式  Exception の operation / 等式 を合わせて、一つのエフェクト理論として見る、という方向があります。 つまり、  get, set  raise を同じ計算の中に持つエフェクト理論を考える、ということです。 【整理】

Slide 131

Slide 131 text

ただし、組み合わせ方は一つではない 複数のエフェクトを合わせるとき、単に operation を並べればすべてが決まるわけではありません。 問題になるのは、たとえば次のようなことです。 ● それぞれの等式をどう保つか ● エフェクト同士の相互作用をどう扱うか ● handler の順序で意味が変わる場合をどう見るか つまり、合成は単なる機能追加ではなく、意味の問題でもあります。 このため、合成は大きな理論的テーマになります。 【整理】

Slide 132

Slide 132 text

理論側の流れ実装側の流れ ここで、話を「理論側」と「実装側」の二つの流れに分けておきます。 理論側の例: ・複数のエフェクト理論をどう組み合わせるか ・エフェクト同士の相互作用をどう記述するか ・エフェクトシステム や graded monad とどう接続するか 実装側の例: ・Monad transformers ・Free monad ・Coproduct / Data types à la carte ・Extensible Effects ・ 実用言語の effect handlers 【整理】

Slide 133

Slide 133 text

実装側の問題意識 実装側では、主に次のような問題がありました。 ・複数のエフェクトをどう扱うか ・monad transformer の lift をどう減らすか ・エフェクトを後から追加しやすくできるか ・handler / interpreter を差し替えられるか この流れの中で、 ・Free monad ・Freer monad ・Extensible Effects などの実装技法が発展しました。 ([Oleg Kiselyov, Hiromi Ishii. 2015] Freer Monads, More Extensible Effects [Oleg Kiselyov, Amr Sabry, Cameron Swords. 2013] Extensible Effects: An Alternative to Monad Transformers) これらは、代数的エフェクトの理論から派生して出てきたものではありません。 しかし、後から見ると、 operation 木と handler の考え方で代数的エフェクトに近い構造が見えてきます。 【整理】

Slide 134

Slide 134 text

理論側の発展 理論側でも、合成やエフェクトの追跡は大きなテーマになります。 複数のエフェクトを扱うと、 ・どのエフェクトを使ったか ・どの範囲でエフェクトが現れるか ・どのリソースに触れる可能性があるか といった情報も問題になります。 この方向で出てくるのが、 Parametric effect monads ※や、その後の Graded Monad の流れです。 (※ [Shin-ya Katsumata 2014] Parametric effect monads and semantics of effect systems) 【理論】

Slide 135

Slide 135 text

Graded Algebraic Theories さらに Graded Monad に対応する operation / 等式 側の理論も整理されています。 ([Satoshi Kura. 2020] Graded Algebraic Theories) 今回見た基本構図では、  operation / 等式  自由モデル  計算モナド という流れを見ました。 Graded の方向では、この対応を Grade つきの世界へ広げます。 また、エフェクトを組み合わせるための sums や tensor products も扱われます。 ここでは深入りしません。 大事なのは、operation / 等式 で エフェクトを見る考え方が、さらに先の理論へ拡張されている、ということです。 【理論】

Slide 136

Slide 136 text

合成についてのまとめ 代数的エフェクトは、 effect を簡単に合成するための機能 として出発したわけではありません。 出発点は、 計算エフェクトを operation と等式から見ること でした。 しかし、実用上は合成が重要です。 そのため、理論側では合成や Graded Monad の方向へ発展し、実装側では Free monad や Extensible Effects などの流れが発展しまし た。 これらは別々の動機から出てきましたが、後から operation 木、handler、モナドという観点で接続して見えてきます。 【整理】

Slide 137

Slide 137 text

発展

Slide 138

Slide 138 text

代数的エフェクトの枠組みは、さまざまな方向へ拡張されています。 (以下はその例の一部です) ・一つの sort だけを見る話   → 多ソート / S-ソートへ ・圏 Set 上で考える話   → Poset, ω-Cpo, presheaf category などの圏へ ・単純な operation を扱う話 → scope を持つ operation / 計算を引数に取る operation (higher-order operation) へ ・operation と等式で理論を作る話 → enriched / graded な理論へ ・通常の monad で エフェクト を表す話 → Graded Monad へ ・一つの エフェクト を見る話 → 複数の エフェクト を組み合わせる話へ ・通常の handler で処理する話 → scoped / higher-order effects を扱う handler へ 拡張 【整理】

Slide 139

Slide 139 text

おわり