モニャドセミナー4 資料 抜粋 + 追加
追加分は最後。
前置きとか予定とか(ほとんど)省略
- スタンピング・モナド(or コモナド)に限定
- 現実のプログラミングやシステムとの関係を強調する
- ラップ/アンラップが基本的な道具だよ
- 目標は、トランザクション計算(エコ計算)の、作用付き両クライスリ圏の構成
箴言集
- 対象に要素(元)があると思うな。あっても使うな。(「初等的」って言うのだ)
- 認識や分類は観察者の主観であって、対象物側にあるのではない。
- 態度を変えれば、同じ対象物に違う構造が見えてくる。違う構造は違うモノ。
- 極めてツマンナイものに注目する。空、単元集合、pointing map、自明モノイド(いくつかの意味がある)、包含写像、射影、忘却関手など。
- 用語・記法の歴史的な経緯や事情はあきらめろ。いまさらどうにもならない。(が、檜山はあきらめが悪い。)
- 記号はいつだって足りない、ホントに足りない。A, B, C∈|C| -- アリッ!?
- ズボラな記法や用法に慣れる。idA = A とかは、計算上も重要なズボラ・テク。
モノイドとコモノイド
- 特に今日は、整数の足し算(カウンタ)、文字列の連接(テキストファイル)、2次元アフィン変換(タートル・グラフィックス)を考える。
- [追記]タートルが2次元アフィン変換はほぼ嘘だった。砲台モナドを作るつもりだ。[/追記]
- モノイドの矢印をひっくり返せば、コモノイドの定義と法則
- 今日使うコモノイドは一種類、演算の名前は色々:対角、余積(余乗法)、余加法、複製、分岐などなど。
今日取り扱う圏と関手
Mはモノイド、Vはコモノイドと約束する。
記号 | 短い説明 |
---|---|
C | 基本とする圏、モノイド積を持つ |
C×M | Mによる右スタンピング構成(で得られた圏) |
M×C | Mによる左スタンピング構成 |
M×S | M-加群Sによる右スタンピング構成、左も使うかも |
RM | Mによる右スタンピング(右掛け算)関手 C→C |
LM | Mによる左スタンピング(左掛け算)関手 C→C |
Kl(RM) | 右スタンピング・モナドRMのクライスリ圏 |
Kl(LM) | 左スタンピング・モナドLMのクライスリ圏 |
CoKl(LV) | コモノイドVによる左スタンピング・コモナドLVの余クライスリ圏 |
DiKl(LV, RM) | 両(双)クライスリ圏 |
AcDiKl(LV, RM) | 作用付き両クライスリ圏 |
その他、重要な関手
- J : A×C→C -- スタンピング構成した圏から、もとの圏へ
- W : Kl(RM)→C×M ラッピング
- W' : Kl(RM)→C×S ラッピングもどき、一番わかりやすいが、アンラップ(中身の取り出し、再現)ができない
- W : Kl(LV)→V×C ラッピング
- W : DiKl(LV, RM)→V×C×M ラッピング
- W : AcDiKl(LV, RM)→V×C×M ラッピング
スタンピング構成
今日ずっと基礎にする圏C -- 背景圏、環境(アンビアント〈アンビエント〉)圏。
- なんらかのデータ型、データ領域が対象
- なんらかの計算処理/計算主体が射
- 計算処理/計算主体を計算エージェントと呼ぶことがある
- 計算エージェントは内部と外部をわかつ境界を持っている
- 入出力は、n-in m-out または、タプリングを許して 1-in 1-out
A∈|C|を固定して、次の圏を作れる。
- 対象は A×X の型のCの対象
- 射は、A×X→A×Y の形のCの射
- dom(f:A×X→A×Y) = X
- cod(f:A×X→A×Y) = Y
- compはfのcomp
この圏を A×C、面倒だから A×C と書く(これはイイカゲン過ぎてヤバイ)。[追記](A×)C くらいで手を打つか?[/追記]
ホムセットによる定義がいいかも。
関手J
J: A×C→C
- J(X) = A×X
- J(f:X→C in A×C) = (f in C)
このJは現実的にどんな意味があるか?
- X→Y が、Cでは A×X→A×Y ってことは、、、
- クラス定義を固定しての、、、
- ×××を素朴な純関数計算で表してみると
数式と現象
- 二次関数を学び、ちゃんと使える人はたくさんいる。
- その二次関数で、「投げたボール」を記述できて、到達点を計算できることを知らない人はたくさんいる。
- 小中学校の素材のなかにも、あれだけ圏が発見できる。
- プログラミングやシステムの「現象」に、圏やモナドが含まれてないハズはないでしょ。どう考えても。
- ヒープ(共有領域)もスタック(プライベート領域)も、参照引数も値引数も、イミュータビリティもディープコピーも、クラスとオブジェクトも、単一代入も、DIも、総称関数も依存型も、当然に圏論で現象記述(定式化)できるよ。当たり前だ。
今日のモノイドさん、モナドさん
- 有限カウンタ 0から9 有界 →カウンター・モナド - 檜山正幸のキマイラ飼育記 メモ編
- 有限カウンタ 0から9 サイクリック(ラップアラウンド) →サイクリック・カウンター・モナド - 檜山正幸のキマイラ飼育記 メモ編
- 出力モードのテキストファイル
- タートルグラフィックス ペンなし →タートル・モナド - 檜山正幸のキマイラ飼育記 メモ編
- タートルグラフィックス ペンあり
- 状態値と作用値と遷移
- あるいは、位置と力と運動
それっ、クライスリ圏
実例で考えると、状態空間への更新リクエストAPIを使う関数だよね。
ラッピングを使ってみよう
- オブジェクト指向風の実行環境の上で実装するってことだね
- アンラップできるところがミソ
- アンラップがあるので、ラッピングは単射(埋め込み)
- 既にクライスリ圏を作っているので、ラッピングは関手だと言っていい
ラッピングを先に考えると
Dがマグマ、Cが圏、F:D→C という対応があり:
- Fは単射
- Fはマグマの結合演算を保つ
このとき、Dは半圏であり、Fは半関手。
さらに、Dが反射的マグマ、Cが圏、F:D→C という対応があり:
- Fは単射
- Fはマグマの結合演算を保つ
- Fはマグマの恒等を保つ
このとき、Dは圏であり、Fは関手。
以上の事実を使って、クライスリ圏を構成してみよう。
余クライスリ圏
対角コモノイドのコモノイダル・スタンピング・モナドから、反射的マグマを作り、
余クライスリ圏も作ってしまえ。
状態スタンピングはイマイチ
ラッピングに近いことができるが、作用がどうなっているか外部からは予測できないので、アンラップできない。アンラップがないので単射性が示せず、埋め込み関手が構成できない。
もう少し工夫しないと。
ここらで愚痴を言っておきたい
「… だーから右と左のハナシはいやなんだよなー」
- (a・b)*x = a*(b*x) 気持ちいい左作用
- (a・b)*x = b*(a*x) 気持ち悪い左作用
- x*(a・b) = (x*a)*b 気持ちいい右作用
- x*(a・b) = (x*b)*a 気持ち悪い右作用
前回(モニャドセミナー3)でも間違えたしよ。
「理解をさまたげるモノ/誤解をまねくモノ、それと対処」のの「右と左、上と下、前と後」参照
加群(作用)の公理
カウンタ、テキストファイル、タートルグラフィックスが例。
結合律を絵で表そう。
後はなりゆき
クライスリ圏の一般論はたぶんやらないと思うが、 やらない。
後はなりゆき 2
次の計算はアドリブでは不安だ。写真を載せておこう。
あと、双モノイド法則(3種4種)が必要だが、それはアドリブ。
ここから追加分
ちょっと練習問題
- 値が{0, 1}だけの有界カウンタの標準的(常識的に自然な)オペレーション・モノイドを記述せよ。
- モノイド{u, d}* (星はクリーニスター)から、すぐ上のオペレーション・モノイドへのモノイド射(準同型)を記述せよ。
- 値が{0, 1}だけのサイクリック・カウンタの標準的オペレーション・モノイドを記述せよ。
- モノイド{u, d}* から、すぐ上のオペレーション・モノイドへのモノイド射(準同型)を記述せよ。
- モノイド{u, d}* ではなくて、Z(整数)の足し算モノイドからのモノイド射を記述せよ。
- モノイド{on, off, toggle}* から、End({0, 1})への常識的なモノイド準同型を記述せよ。
- モノイド{on, off, toggle}* に関係を入れて、End({0, 1}) と同型なモノイドを作れ。
- 平面格子内を動く、マウス・グラフィックスの状態空間とモノイドを定義せよ。
状態空間スタンピングがダメな理由
- モノイド作用が計算エージェント内に分離不可能に組み込まれている
- アンラップできない
- 作用の取り替えができない
- よって、柔軟性が低い
作用の取り替え
- モノイド作用のモノイドの取り替え
- モイイド作用の状態空間の取り替え
状態空間Sの標準モノイド=End(S)、作用の取り替え定理が成立する。
- a:M×S→S が作用で、f:N→M がモノイド射(モノイドの圏の射=モノイド準同型)のとき、新しい作用b:N×S→S が定義できる。
- a:M×S→S が作用構造で、g:T→S, h:S→T が射(背景圏の射)で、ある条件を満たす
ならなら、新しい作用c:M×T→T が定義できる。
モナディックなクラアント/サーバー・アーキテクチャ
構成要素は:
クライアント側計算エージェント | クライスリ射 |
リクエスト発行チャンネル | クライスリ射のスタンピング出力成分 |
リクエスト・キューイング(累積) | モノイド演算(乗法) |
累積されたリクエスト | モノイドの元 |
リクエスト実行(アクション) | モノイド作用 |
状態空間 | モノイドの被作用域(加群の台) |