圏論とHaskellは
仲良し
法政大学
大森健児
自己紹介
1969年5月卒業
1972年9月卒業
1969-85 企業の研究所で
マルチプロセッサシステム
2016.2.29最終講義
1985-2016大学で教育と研究
圏論
数学は、元来、抽象的だが、
その中で最も抽象的なのが圏論
それぞれの分野を圏とし、
それらに共通するものを扱う
カテゴリーには、
・集合の圏
・モノイドの圏
・群の圏
・ベクトル空間の圏
・グラフの圏
・実数の集合と
連続関数の圏
・位相空間の圏
・デカルト閉圏
圏とは
1.対象(集合:要素の集まり)
2.射(関数)
3.ソース、ターゲット
4.恒等射
5.合成(結合律)
例:自然数の加算
(モノイド)
𝑛
恒等射:0
合成: +
0
1
・
例:自然数の加算
+𝑛
恒等射:0
合成:
+𝑚 ° +𝑛 = +(𝑚 + 𝑛)
+0
+1
・
ℕ
カリー化
𝑓
𝑔
ℎ
𝐴
𝐵
𝐶
例:集合と写像の圏
𝑥 𝑦 𝑧
𝑤
𝑢 𝑣
𝑎 𝑏 𝑐
𝑑
𝑒 𝑥 𝑦 𝑧𝑢 𝑣 𝑤
𝑑 𝑒𝑎 𝑏 𝑐
𝑋
𝑃
𝑠 𝑡
例:グラフの圏
ノードとエッジを対象に
圏論
𝑛
例:自然数とその列
[𝑛]
𝐹 = [ ]
米田の補題 Nat(Hom 𝑆𝑒𝑡𝑠(𝑋, _), 𝐹) ≅ 𝐹(𝑋)
X
Hom 𝑆𝑒𝑡𝑠(𝑋, _)
圏𝐶
𝐹(𝑋)
圏𝑆𝑒𝑡𝑠
𝐹
随伴関手Hom 𝐴(𝐿(𝐵), 𝐴) ≅ Hom 𝐵(𝐵, 𝑅(𝐴))
圏𝐵 圏𝐴
𝐿
𝑅
赤ん坊
の世界
雑音
中学生
の世界
会話中学生:職場体験
𝑎
𝑏
𝑏 ∘ 𝑎
= 𝑏 + 𝑎
(+𝑎)
(+𝑏)
+𝑏 ∘ +𝑎
= + 𝑏 + 𝑎
𝐹
𝒞1 ࣝ2
ℕ
ℕ
ℕ
例:カリー化からモ
ノイドへの写像
関手:
圏𝒞から圏𝒟への関手𝐹: 𝒞 → 𝒟とは、圏𝒞の対象𝐴を圏𝒟の対象𝐹(𝐴)に対応付け、圏𝒞の 射
𝑓: 𝐴 → 𝐵を圏𝒟の対象𝐹(𝑓)に対応付ける関数の組で、次の二つの条件を満たすものである。
1) 𝒞の任意の二つの射𝑓: 𝐴 → 𝐵, 𝑔: 𝐵 → 𝐶に対して、𝐹(𝑔 ⋅ 𝑓) = 𝐹(𝑔) ∘ 𝐹(𝑓)である。
2) 𝒞の任意の対象𝐴に対して、𝐹(1 𝐴) = 1 𝐹( 𝐴)
である。
𝐴
𝐵
𝑓
𝒞
𝐹(𝐴)
𝐹(𝐵)
𝐹(𝑓)
𝒟
𝐹
新しい圏に
Universal Properties
積の定義:
対象𝐵1, 𝐵2の積とは、対象𝑃、射𝑝1: 𝑃 → 𝐵1, 𝑝2: 𝑃 → 𝐵2から
なり、次の条件を満足するものである。
任意の対象𝑋と任意の射𝑓1: 𝑋 → 𝐵1, 𝑓2: 𝑋 → 𝐵2が与えられ
た時、以下の図式が可換となるような𝑢: 𝑋 → 𝑃が唯一つ
存在する。
このとき、𝑃は 𝐵1 × 𝐵2と表す。
最大公約数 積集合
Universal Properties
和の定義:
対象𝐵1, 𝐵2の和とは、対象𝑄、射𝑞1: 𝑄 → 𝐵1, 𝑞2: 𝑃 → 𝐵2か
らなり、次の条件を満足するものである。
任意の対象𝑌と任意の射𝑔1: 𝐵1 → 𝑌, 𝑔2: 𝐵2 → 𝑌が与えられ
た時、以下の図式が可換となるような𝑢′: 𝑄 → 𝑌が唯一つ
存在する。
このとき、𝑄は 𝐵1 + 𝐵2と表す。
最小公倍数 和集合
Haskell プログラミング言語で、カテゴリー(圏論)を
ベースにしているのは、Haskell
関数型言語の歴史
素数
primes = filterPrime [2..]
where filterPrime (p:xs) =
p : filterPrime [x | x <- xs, x `mod` p /= 0]
クイックソート
quicksort [] = []
quicksort (x:xs) = quicksort smaller ++ [x] ++ quicksort larger
where smaller = [a | a <- xs, a < x]
larger = [a | a <- xs, a >= x]
関数とは
𝑣 = 𝑣0 − 𝑔𝑑𝑡(速度)
𝑦 = 𝑦0 + 𝑣𝑑𝑡(位置)
言語 年 発明者
ラムダ計算 1930 チャーチ
圏論 1945 マックレーン
LISP 1958 マッカーシー
Scheme 1975 サスマン
Smalltalk-80 1980 ゼロックス社
Haskell 1.0 1990 ハスケル・カリーに因
んで
Haskell 2010 2010
Haskellと圏論
圏
1.対象
2.射
3.ソース、ターゲット
4.恒等射
5.合成(結合律)
Haskell
1.データ型(集合:要素の集まり)
2.関数(クラス・インスタンス)
3.シグニチャ
データ型𝐶
𝑓
𝑔
𝑔°𝑓
データ型𝐷
𝑓′
= 𝑓𝑚𝑎𝑝 𝑓
𝑔′
= 𝑓𝑚𝑎𝑝 𝑔
𝑔′
°𝑓′
= 𝑓 𝑚𝑎𝑝 𝑔°𝑓
= 𝑓𝑚𝑎𝑝 𝑔 °(𝑓𝑚𝑎𝑝 𝑓)
Haskellでの関手
随伴関手
モナド 𝑅°𝐿
モナドの例
入出力
ファイル
Maybe (例外事象)
モナドの利点
ドメイン固有言語
→簡単に作成
圏𝐵 圏𝐴
𝐿
𝑅
忘却関手
赤ん坊
の世界
雑音
中学生
の世界
会話
実世界 純粋な
世界
関数型リアクティブ
プログラミング
関数型言語を実世界へ
・ロボット
・ゲーム
・シミュレーション
動画
ビリヤード台で衝突
しあう二つのボール
ビリヤード座標系 重心座標系
simulation :: HasTime t s => Wire s () IO a (Ball, Ball)
simulation = proc _ -> do
rec b1 <- ball "ball1" mass1 radius1 vInit1 pInit1 -< ("ball1", c)
b2 <- ball "ball2" mass2 radius2 vInit2 pInit2 -< ("ball2", c)
c <- collision -< (b1, b2)
returnA -< (b1, b2)
振舞い:時間を変数とする関数
イベント:ある時間での事象
例 :音楽
振舞い :曲
イベント:打鍵
デモ
Time
Int x
Time
Int
2
stepper 2 x
詳細は
http://bitterharvest.hatenablog.com/entry
/2015/09/24/164937
さらに勉強する人のために
ご清聴ありがとうございました。
http://bitterharvest.hatenablog.com
でお会いしましょう。

圏論とHaskellは仲良し