- 三上遼
- 0x20歳
- IoTの会社でスマートロック作ってます
- 数学弱いです
- twitter @mikamix
- facebook Ryo Mikami
- (だいたい) foldの話です
- (だいたい) List a = Nil | Cons a List のことです
- (だいたい) foldのことです
- 始代数とCatamorphismをListに具体化してお話しします
- (なるべく) 簡単にしました
- (なるべく) 圏論を知らなくてもわかるようにしました
- (たぶん) List以外のCatamorphismについて
- Catamorphismの一般化
- 圏論の深い話
(b, a -> b -> b) を取って [a] -> b を返す関数
fold :: (b, a -> b -> b) -> [a] -> b
len :: [a] -> Integer
len = fold (0, inc)
sum :: [Integer] -> Integer
sum = fold (0, (+))
foldに(f, g)を渡すと [a] -> b が返る
[A]
|
| fold (f, g)
v
1 -> Int <- A * Int
f g
nil cons
1 -> [A] <- A * [A]
|
| fold (f, g)
v
1 -> Int <- A * Int
f g
なんか上と下似てますね
nil cons
1 -> [A] <- A * [A]
|
| fold (f, g)
v
1 -> Int <- A * Int
f g
nil cons
1 -> [A] <- A * [A]
|
| fold (f, g)
v
1 -> B <- A * B
f g
nil cons
1 -> [A] <- A * [A]
|
| fold (f, g) <-- (f, g)に対して一意に定まる
v
1 -> B <- A * B <-- ココをいっぱい作る
f g
nil cons
1 -> [A] <- A * [A] <- ココも対象
|
| fold (f, g) <-- ココが射
v
1 -> B <- A * B <-- ココが対象
f g
- 任意の対象に対してちょうど一つの射が存在するような対象
nil cons
1 -> [A] <- A * [A] <- ココが対象で
|
| fold (f, g) <-- 下の対象に対して一意
v
1 -> B <- A * B <-- ココも対象
f g
- 上と下をF-代数と呼ぶ
- fold (f, g) はF-代数の射
- F-代数の圏における始対象をF-始代数と呼ぶ
- 始代数からの射をCatamorphismと呼ぶ
nil cons
1 -> [A] <- A * [A] <- F-代数の圏の始対象
|
| fold (f, g) <-- F-代数の射
v
1 -> B <- A * B <-- ココがF-代数
f g
Before
nil cons
1 -> [A] <- A * [A] <- F-代数の圏の始対象
|
| fold (f, g) <-- F-代数の射
v
1 -> B <- A * B <-- ココがF-代数
f g
After
(nil, cons)
[A] <---------- 1 + A * [A]
|
| fold (f, g)
v
B <---------- 1 + A * B
(f, g)
Before
(nil, cons)
[A] <---------- 1 + A * [A]
|
| fold (f, g)
v
B <---------- 1 + A * B
(f, g)
After
in
X <---------- 1 + A * X
|
| (|phi|) <- バナナ
v
B <---------- 1 + A * B
phi
F(X) = 1 + A * X
Before
in
X <---------- 1 + A * X
|
| (|phi|) <- バナナ
v
B <---------- 1 + A * B
phi
After
in
X <---------- F(X)
|
| (|phi|)
v
B <---------- F(B)
phi
in
X <---------- F(X)
| |
| (|phi|) | F((|phi|))
v v
B <---------- F(B)
phi