A monad is just a monoid
in the category of
endofunctors,
what's the problem?
ෆશʹ͓ͯ͠Αͦਖ਼͘͠ͳ͍ϓϩάϥϛϯάݴޠখ࢙
ݩωλɺ.BD-BOFʮݍͷجૅʯ
Slide 22
Slide 22 text
Ϟφυ୯ͳΔࣗݾؔख
ͷݍʹ͓͚ΔϞϊΠυର
ͩΑɻԿ͔Ͱ?
Slide 23
Slide 23 text
No content
Slide 24
Slide 24 text
Ϟφυ୯ͳΔࣗݾؔख
ͷݍʹ͓͚ΔϞϊΠυର
ͩΑɻԿ͔Ͱ?
Slide 25
Slide 25 text
ࣗݾؔखͷݍ
ϞϊΠυର
Slide 26
Slide 26 text
ؔख
Functor
Slide 27
Slide 27 text
ݍ ݍ
Slide 28
Slide 28 text
ݍ ݍ
Slide 29
Slide 29 text
ݍ ݍ
Slide 30
Slide 30 text
ܕͷݍ
String [String]
Int [Int]
Bool [Bool]
Array
ܕͷݍ
f
g
map(f )
map(g)
g ∘ f
map(g ∘ f )
map(g) ∘ map(f )
=
Slide 31
Slide 31 text
A
B
C
ݍ
F
f
g
g ∘ f
ݍ
F(f)
F(g)
F(A)
F(B)
F(C)
F(g ∘ f)
F(g) ∘ F(f)
=
Slide 32
Slide 32 text
ؔखͷ߹
Functor Composition
Slide 33
Slide 33 text
A
B
C
ݍ
f
g
g ∘ f
ݍ
F(f)
F(g)
F(A)
F(B)
F(C)
F(g ∘ f)
F(g) ∘ F(f)
=
F
Slide 34
Slide 34 text
ݍ ݍ
F
A
B
C
f
g
g ∘ f
F( f )
F(g)
F(A)
F(B)
F(C)
F(g ∘ f )
F(g) ∘ F( f )
=
Slide 35
Slide 35 text
খ͍͞ݍ
খ͍͞ݍ
(খ͍͞ݍͷݍ)
F
A
B
C
f
g
g ∘ f
F( f )
F(g)
F(A)
F(B)
F(C)
F(g ∘ f )
F(g) ∘ F( f )
=
Cat
Slide 36
Slide 36 text
খ͍͞ݍ
খ͍͞ݍ
(খ͍͞ݍͷݍ)
F
A
B
C
f
g
g ∘ f
F( f )
F(g)
F(A)
F(B)
F(C)
F(g ∘ f )
F(g) ∘ F( f )
=
Cat
খ͍͞ݍ
G
G(F( f ))
G(F(g))
G(F(A))
G(F(B))
G(F(C))
G(F(g ∘ f ))
G(F(g)) ∘ G(F( f ))
=
Slide 37
Slide 37 text
খ͍͞ݍ
খ͍͞ݍ
(খ͍͞ݍͷݍ)
F
A
B
C
f
g
g ∘ f
F( f )
F(g)
F(A)
F(B)
F(C)
F(g ∘ f )
F(g) ∘ F( f )
=
Cat
খ͍͞ݍ
G
G(F( f ))
G(F(g))
G(F(A))
G(F(B))
G(F(C))
G(F(g ∘ f ))
G(F(g)) ∘ G(F( f ))
=
G ∘ F
Slide 38
Slide 38 text
A
B
C
ݍ
G ∘ F
f
g
g ∘ f
ݍ
G(F(f))
G(F(g))
G(F(A))
G(F(B))
G(F(g ∘ f))
G(F(g)) ∘ G(F(f))
=
G(F(C))
Slide 39
Slide 39 text
(খ͍͞ݍͷݍ)
F
C D
Cat
Slide 40
Slide 40 text
(খ͍͞ݍͷݍ)
F G
C D E
Cat
G ∘ F ؔखͷ߹
Slide 41
Slide 41 text
(খ͍͞ݍͷݍ)
F G
C D E
Cat
G ∘ F
I I I
߃ؔख
ؔखͷ߹
Slide 42
Slide 42 text
(খ͍͞ݍͷݍ)
Cat
F G
C D E
G ∘ F
E′
H
H ∘ G
(H ∘ G) ∘ F
H ∘ (G ∘ F) ྆ऀ͍͠
(݁߹Λຬͨ͢)
Slide 43
Slide 43 text
ؔखݍ
Functor Category
Slide 44
Slide 44 text
(খ͍͞ݍͷݍ)
Cat
F
C D
Slide 45
Slide 45 text
(খ͍͞ݍͷݍ)
Cat
C D
F
H
G
Slide 46
Slide 46 text
(খ͍͞ݍͷݍ)
Cat
C D
F
H
G
α
β
Slide 47
Slide 47 text
A
B
F
f
H
F(A) F(B)
F(f)
α
C D
G(A) G(B)
G(f)
H(A) H(B)
H(f)
β G
αA
αB
βA
βB
Slide 48
Slide 48 text
A
B
F
f
H
F(A) F(B)
F(f)
α
C D
G(A) G(B)
G(f)
H(A) H(B)
H(f)
β G
αA
αB
βA
βB
β ∘ α βA
∘ αA
βB
∘ αB
ࣗવมͷ
ਨ߹
(݁߹Λຬͨ͢)
Slide 49
Slide 49 text
(খ͍͞ݍͷݍ)
Cat
C D
F
H
G
α
β
ؔखݍ DC
Slide 50
Slide 50 text
(ؔखݍ)
α β
F G H
DC
Slide 51
Slide 51 text
α β
F G H
β ∘ α
id id id
߃ࣗવม
ࣗવมͷ(ਨ)߹
(݁߹Λຬͨ͢)
(ؔखݍ)
DC
Slide 52
Slide 52 text
ࣗݾؔखͷݍ
Category of Endofunctors
Slide 53
Slide 53 text
(খ͍͞ݍͷݍ)
Cat
C D
F
H
G
Slide 54
Slide 54 text
(খ͍͞ݍͷݍ)
Cat
C C
F
H
G
Slide 55
Slide 55 text
(খ͍͞ݍͷݍ)
Cat
C
F
G
H
Slide 56
Slide 56 text
(খ͍͞ݍͷݍ)
Cat
C
G ∘ F F
G
H
I
Slide 57
Slide 57 text
(খ͍͞ݍͷݍ)
Cat
C
G ∘ F F
G
H
I
ࣗݾؔखͷݍ
CC
α
β
Slide 58
Slide 58 text
α β
F G H
(ؔखݍ)
DC
Slide 59
Slide 59 text
α β
F G H
(ࣗݾؔखͷݍ)
CC
I G ∘ F
߃ؔख
(୯Ґݩ)
ؔखͷ߹
(ೋ߲ԋࢉ)
Slide 60
Slide 60 text
ϞϊΠυ
Monoid
Slide 61
Slide 61 text
ϞϊΠυ
ೋ߲ԋࢉ
୯Ґݩͷଘࡏ
Slide 62
Slide 62 text
(Int, +, 0)
a + 0 = a
0 + a = a
(a + b) + c = a + (b + c)
ϞϊΠυͷྫ
Slide 63
Slide 63 text
(Int, *, 1)
a * 1 = a
1 * a = a
(a * b) * c = a * (b * c)
ϞϊΠυͷྫ
Slide 64
Slide 64 text
(String, +, ””)
a + ”” = a
”” + a = a
(a + b) + c = a + (b + c)
ϞϊΠυͷྫ
Slide 65
Slide 65 text
(Array, +, [])
a + [] = a
[] + a = a
(a + b) + c = a + (b + c)
ϞϊΠυͷྫ
Slide 66
Slide 66 text
(Bool, &&, true)
a && true = a
true && a = a
(a && b) && c = a && (b && c)
ϞϊΠυͷྫ
Slide 67
Slide 67 text
(Bool, ||, false)
a || false = a
false || a = a
(a || b) || c = a || (b || c)
ϞϊΠυͷྫ
Slide 68
Slide 68 text
(Int, max, minBound)
max(a, minBound) = a
max(minBound, a) = a
max(max(a, b), c)
= max(a, max(b, c))
ϞϊΠυͷྫ
Slide 69
Slide 69 text
(Int, min, maxBound)
min(a, maxBound) = a
min(maxBound, a) = a
min(min(a, b), c)
= min(a, min(b, c))
ϞϊΠυͷྫ
Slide 70
Slide 70 text
ϞϊΠυ
w ू߹ɺೋ߲ԋࢉ υοτ
ɺ୯Ґݩͷͭ
ͰɺҎԼͷ݅Λຬͨ͢ɿ
w ݁߹ҙͷʹ͍ͭͯ
w ୯Ґݩҙͷʹ͍ͭͯ
(a ⋅ b) ⋅ c = a ⋅ (b ⋅ c)
e ⋅ a = a ⋅ e = e
a, b, c ∈ M
a ∈ M
M ⋅ e ∈ M (M, ⋅ ,e)
(M, ⋅ ,e)
Slide 71
Slide 71 text
// Swift ʹ͓͚ΔϞϊΠυ
protocol Monoid {
static func <> (lhs: Self, rhs: Self) -> Self
static var empty: Self
}
-- Haskell ʹ͓͚ΔϞϊΠυ
class Monoid a where
(<>) :: a -> a -> a
mempty :: a
Slide 72
Slide 72 text
ݍʹ͓͚ΔϞϊΠυ
Monoid in Category Theory
Slide 73
Slide 73 text
Int
1
…
3
(+):
(Int,Int) -> Int
ΛࣹͰදݱ͍ͨ͠l
0 2
୯Ґݩ
Slide 74
Slide 74 text
Int
0
1
2
…
3
୯Ґݩ
ϖΞΛ࡞ͬͯɾɾɾ
ೋ߲ԋࢉʁ
͜ͷॻ͖ํݍͰͳ͍
ΛࣹͰදݱ͍ͨ͠l
(+):
(Int,Int) -> Int
Slide 75
Slide 75 text
σΧϧτੵ ੵू߹
(0,0)
(1,0)
(0,2)
…
(1,2)
Int
0
1
2
…
3
(Int,Int)
ͱॻ͘
Int × Int
Int
0
1
2
…
3
Int
0
1
2
…
3
ϖΞ
λϓϧ
(+)
Slide 76
Slide 76 text
(0,0)
(1,0)
(0,2)
…
(1,2)
Int
0
1
2
…
3
(+)
ೋ߲ԋࢉΛIntͷ
ʮ֎ʯͰఆٛ͢Δ
෦Ͱࣹ(ߏ)Λ
ߟ͑ͳ͍
(Int,Int)
Int
0
1
2
…
3
Int
0
1
2
…
3
ϖΞ
λϓϧ
σΧϧτੵ ੵू߹
σΧϧτੵ
Int × Int
Slide 77
Slide 77 text
(+) : (Int, Int) -> Int
ΧϦʔԽ͢Δͱɺ
(+) : Int -> (Int -> Int)
ϖΞΛ࡞ͬͯɺIntʹม
ϖΞΛ࡞Βͣɺ
IntΛʮࣗݾؔʯʹม
ͱ͜ΖͰɾɾɾ
Slide 78
Slide 78 text
୯Ұରݍ
Int
(0+)
(1+)
(2+)
Int
(0+)
Int -> Int
0
1
2
…
3
(1+)
(2+)
…
(3+)
(+)
Slide 79
Slide 79 text
୯Ұରݍ
Int
(0+)
(1+)
(2+)
Int
(0+)
Int -> Int
0
1
2
…
3
(1+)
(2+)
…
(3+)
(+)
߃ม
ࣹͳͷͰɺ
߹Մೳ
Slide 80
Slide 80 text
0 + 1 + 2
(0+) ∘ (1+) ∘ (2+)
(+)ͷ෦ద༻
ࣗݾؔԽ
Int
(0+)
Int -> Int
0
1
2
…
3
(1+)
(2+)
…
(3+)
(+)
Slide 81
Slide 81 text
Int
(0+)
Int -> Int
0
1
2
…
3
(1+)
(2+)
…
(3+)
{ f in f(0) }
\f -> f 0
0 + 1 + 2
(0+) ∘ (1+) ∘ (2+)
୯ҐݩΛద༻
ʹ͢
PS
Int
0
1
2
…
3
ೋ߲ԋࢉΛIntͷ
ʮ֎ʯͰఆٛ͢Δ
୯Ґݩ
()
୯ҐݩΛܾΊΔࣹΛ
ʮ֎ʯͰఆٛ͢Δ(ҰൠԽݩ)
Ұݩू߹
(Int,Int)
0
(+) Unit
Slide 88
Slide 88 text
ϞϊΠυର (M, μ, η)
μ η
1
୯Ґࣹ
ೋ߲ԋࢉ
M × M M
Slide 89
Slide 89 text
Int
0
1
2
…
3
Unit
()
(Int,Int)
⟨ Int, Int ⟩
ϖΞ
0
(+)
=
Int ⊗ Int
⊗ = (, )
(Int × IntͷҰൠԽ)
Slide 90
Slide 90 text
(Int × IntͷҰൠԽ)
Int
0
1
2
…
3
()
()
ϖΞ(ܕͰͳ͍)
λϓϧܕ
ʮϖΞΛ࡞Δʯ͜ͱͱʮϖΞΛܕͱ
Έͳ͢(λϓϧ)ʯ͜ͱΛ͢Δ
ςϯιϧੵ (ޙड़)
(Int,Int)
Int ⊗ Int
=
⟨ Int, Int ⟩
ϖΞ
⊗ = (, )
Slide 91
Slide 91 text
ϞϊΠυର (M, μ, η)
μ η
I
M ⊗ M M
୯Ґࣹ
ೋ߲ԋࢉ
Slide 92
Slide 92 text
(σΧϧτੵͷҰൠԽ)
⊗ ୯Ґର
(Ұݩू߹ͷҰൠԽ)
μ η
I
M ⊗ M M
⊗
ςϯιϧੵ
Slide 93
Slide 93 text
ϞϊΠμϧݍ
Monoidal Category
Slide 94
Slide 94 text
ςϯιϧੵ ⊗ : C × C → C
M I
M ⊗ M
⊗
୯Ґର
(ϞϊΠμϧݍ)
C
(C, ⊗ ,I, α, λ, ρ)
Slide 95
Slide 95 text
M I
M ⊗ M
M ⊗ I
M ⊗ M′ (M ⊗ M′) ⊗ M′′
طଘͷରͷϖΞ͔Β
৽ͨͳରΛ࡞Γग़ͤΔ
ςϯιϧੵ ⊗ : C × C → C
(ϞϊΠμϧݍ)
C
(C, ⊗ ,I, α, λ, ρ)
⊗
Slide 96
Slide 96 text
ςϯιϧੵ
⟨M ⊗ M′, M′′⟩
ੵͷݍ
I
M
M ⊗ M
⟨M, M⟩
C × C
M ⊗ M′
⟨M, M′⟩
⋯
⊗
(M ⊗ M′) ⊗ M′′
ݍͷϖΞ
⊗
⋯
(ϞϊΠμϧݍ)
C
(C, ⊗ ,I, α, λ, ρ)
ؔख
Slide 97
Slide 97 text
ϞϊΠμϧݍ
wςϯιϧੵ
w୯Ґର
w݁߹ࢠ
wࠨ୯Ґࢠ
wӈ୯Ґࢠ
⊗ : C × C → C
I ∈ Ob(C)
αA,B,C
: (A ⊗ B) ⊗ C ≅
⟶ A ⊗ (B ⊗ C)
λA
: I ⊗ A ≅
⟶ A
ρA
: A ⊗ I ≅
⟶ A
߸ͷͱ͖ɺ
ετϦΫτϞϊΠμϧݍ
(C, ⊗ ,I, α, λ, ρ)
)BTLFMMʹ͓͚ΔϞφυ
class Functor f where
fmap :: (a -> b) -> f a -> f b
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
class Applicative m => Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a
return = pure
(ࣗݾ)ؔख
ΞϓϦΧςΟϒؔख
Ϟφυ
Slide 122
Slide 122 text
join :: (Monad m) => m (m a) -> m a
join x = x >>= id
)BTLFMMʹ͓͚ΔϞφυ
class Applicative m => Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a
return = pure
Ϟφυ
Slide 123
Slide 123 text
join :: (Monad m) => m (m a) -> m a
join x = x >>= id
)BTLFMMʹ͓͚ΔϞφυ
class Applicative m => Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a
return = pure
ࣗવม η : I → T
Slide 124
Slide 124 text
join :: (Monad m) => m (m a) -> m a
join x = x >>= id
)BTLFMMʹ͓͚ΔϞφυ
class Applicative m => Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a
return = pure
μ : T ⊗ T → T
ࣗવม
Slide 125
Slide 125 text
join :: (Monad m) => m (m a) -> m a
join x = x >>= id
)BTLFMMʹ͓͚ΔϞφυ
class Applicative m => Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a
return = pure
flatMap
Slide 126
Slide 126 text
ϓϩάϥϛϯάͷੈքͰɺ
joinΑΓ
flatMap(>>=)ͷํ͕ॏཁ
Slide 127
Slide 127 text
)BTLFMMʹ͓͚ΔflatMap == (>>=)
(>>=) ::
m a -> (a -> m b) -> m b
͜ͷܕͷҙຯԿʁ
C
B
A
C
B
A
T(B)
T(C)
⋯
C
CT ΫϥΠεϦݍ
⋯
⋯
f
g
gT
fT
ΫϥΠεϦࣹ
(A -> T(B)ͷܗͷࣹ)
Slide 132
Slide 132 text
C
B
A
C
B
A
T(B)
T(C)
⋯
C
CT
⋯
⋯
f
g
gT
fT
྆ऀ ͷࣹͷू߹
Λ
ରԠ͍ͤͨ͞
Slide 133
Slide 133 text
f
g
C
B
A
C
B
A
T(B)
T(C)
⋯
⋯
C
CT
⋯
gT
fT
gT
∘ fT
ରԠͰ͖Δͱɺ
ݍͷࣹͷ߹A -> C͕
ݍ ͷΫϥΠεϦࣹͷ߹
A -> T(C)ʹରԠ͢Δ
CT
C
Slide 134
Slide 134 text
F
G
C
B
A
C
B
A
T(B)
T(C)
⋯
C
CT
⋯
⋯
f
g
gT
fT
ͱͷ
ਵؔखΛߟ͑Δ
CT
C
Slide 135
Slide 135 text
C
B
A
C
B
A
T(B)
T(C)
⋯
C
CT
⋯
⋯
f
g
gT
fT
F
G
ຒΊࠐΈؔख
ରͱࣹΛ
ͦͷ··ࣸ͢
fT
≠ F(f)
ҙɿ
Slide 136
Slide 136 text
f
g
C
B
A
F
G
C
B
A
T(B)
T(C)
⋯
⋯
C
CT
T(A)
⋯
gT
fT
G(fT
)
G(gT
)
֦ுؔख
ͷରΛ
ͷରʹࣸ͢
A
CT
C T(A)
G(A) = T(A)
G(fT
) ≠ T(f)
ҙɿ
Slide 137
Slide 137 text
f
g
C
B
A
F
G
C
B
A
T(B)
T(C)
⋯
C
CT
T(A)
F
gT
fT
G(fT
)
G(gT
)
T2(C)
T2(B)
T(f )
T(g)
μB
ηB
ηC
μA
ηA
ϞφυͳͷͰ
͜ΕΒͷࣹ͕ଘࡏ͢Δ
T
μC
Slide 138
Slide 138 text
g
C
B
A
F
G
C
B
⋯
C
CT
T(A)
F
gT
fT
G(fT
)
G(gT
)
T2(B)
gT
∘ fT
T(f )
μB
ηB
μA
ηA
f
A
T(B)
T(C) T2(C)
T(g)
μC
μC
∘ T(g) ∘ f
ηC
ͱͷΫϥΠεϦ߹
f g
Slide 139
Slide 139 text
ΫϥΠεϦ߹
C
A
gT
∘ fT
f
g
B
A
T(B)
T(C)
μC
∘ T(g) ∘ f
g <
=
< f
=
def
<
=
<
/PUFΫϥΠεϦ߹
݁߹ɾ୯ҐΛຬͨ͢
Slide 140
Slide 140 text
wΫϥΠεϦ߹
ࢀߟ
ؔ߹
ࠨ୯Ґ return <=< f ≡ f
ӈ୯Ґ f <=< return ≡ f
݁߹ (h <=< g) <=< f ≡ h <=< (g <=< f)
Ϟφυଇ ΫϥΠεϦ߹
(<=<) :: (b -> m c) -> (a -> m b) -> (a -> m c)
(.) :: (b -> c) -> (a -> b) -> (a -> c)
ࠨ୯Ґ id . f ≡ f
ӈ୯Ґ f . id ≡ f
݁߹ (h . g) . f ≡ h . (g . f)
Slide 141
Slide 141 text
)BTLFMMʹ͓͚ΔΫϥΠεϦ߹
(<=<) :: Monad m =>
(a -> m b) -> m a -> m b
g <=< f
= join . fmap g . f
μC
∘ T(g) ∘ f
g <
=
< f
=
def
Slide 142
Slide 142 text
)BTLFMMʹ͓͚ΔΫϥΠεϦ߹ ࣮ࡍͷίʔυ
-- | Left-to-right composition of Kleisli arrows.
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
f >=> g = \x -> f x >>= g
-- | Right-to-left composition of Kleisli arrows.
-- > (.) :: (b -> c) -> (a -> b) -> a -> c
-- > (<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> (a -> m c)
g <=< f = \x -> g =<< f x —- (<=<) = flip (>=>)
Slide 143
Slide 143 text
-- | Left-to-right composition of Kleisli arrows.
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c)
f >=> g = \x -> f x >>= g
-- | Right-to-left composition of Kleisli arrows.
-- > (.) :: (b -> c) -> (a -> b) -> a -> c
-- > (<=<) :: Monad m => (b -> m c) -> (a -> m b) -> a -> m c
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> (a -> m c)
g <=< f = \x -> g =<< f x —- (<=<) = flip (>=>)
(=<<) :: Monad m => (a -> m b) -> m a -> m b
f =<< x = x >>= f —- (=<<) = flip (>>=)
)BTLFMMʹ͓͚ΔΫϥΠεϦ߹ ࣮ࡍͷίʔυ
flip(flatMap)
Slide 144
Slide 144 text
(=<<) ::
(a -> m b) -> m a -> m b
͜ͷܕͷҙຯԿʁ
)BTLFMMʹ͓͚Δflip(flatMap) == (=<<)
Slide 145
Slide 145 text
(=<<) ::
(a -> m b) -> m a -> m b
͜ͷܕͷҙຯԿʁ
ʮa -> m bʯͷࣹ͔Β
ʮm a -> m bʯͷࣹʹࣸؔ͢
)BTLFMMʹ͓͚Δflip(flatMap) == (=<<)
Slide 146
Slide 146 text
A
T(B)
C
T(A)
ηA
CT
B
A
g
C
B
T(C)
⋯
G(gT
)
T2(C)
T(g)
ηB
ηC
μA
μC
C
gT
fT
T2(B)
T(f )
μB
F
G
G(fT
)
f
Slide 147
Slide 147 text
A
T(B)
C
T(A)
ηA
CT
B
A
g
C
B
T(C)
⋯
G(gT
)
T2(C)
T(g)
ηB
ηC
μA
μC
C
gT
fT
T2(B)
T(f )
μB
F
G
=
<
<
֦ுԋࢉ
Slide 148
Slide 148 text
A
T(B)
C
T(A)
ηA
CT
B
A
g
C
B
T(C)
⋯
G(gT
)
T2(C)
T(g)
ηB
ηC
μA
μC
C
gT
fT
T2(B)
T(f )
μB
=
<
<
֦ுԋࢉ
F
G
֦ுؔख
Slide 149
Slide 149 text
F
G
f
A
T(B)
C
T(A)
ηA
CT
B
A
g
C
B
T(C)
⋯
G(gT
)
T2(C)
T(g)
ηB
ηC
μA
μC
C
gT
fT
G(fT
)
T2(B)
T(f )
μB
G(fT
) = μB
∘ T(f)
ӈลΛ
ҾʹऔΔؔ
f
Slide 150
Slide 150 text
Ϟφυɾ֦ுԋࢉ =
<
<
A
T(B)
T(A)
B
A
fT
T2(B)
T(f )
μB
μB
∘ T(f)
f =
<
<
=
def
f
Slide 151
Slide 151 text
Ϟφυɾ֦ுԋࢉ
f
A
T(B)
T(A)
B
A
fT
T2(B)
T(f )
μB
f =
<
<
ΛΘͣ ΛͬͯϞφυΛදݱ͢Δ
μ =
<
<
=
<
<
֦ுԋࢉ
=
<
<
Slide 152
Slide 152 text
ΫϥΠεϦɾτϦϓϧ
wࣗݾؔख
wࣗવม
w֦ுԋࢉ
(T, η, =
<
< )
T : C → C
η : I → T
=
<
<: (A → T(B)) → T(A) → T(B)
(g =
<
< ) ∘ (f =
<
< ) = (((g =
<
< ) ∘ f) =
<
< )
(η =
<
< ) = 1T
݁߹
୯Ґ
(f =
<
< ) ∘ η = f Ϟφυଇ
,MFJTMJ4UBSͱݴ͏
f* def
= (f =
<
< )
)BTLFMMʹ͓͚Δ֦ுԋࢉ
(=<<) :: Monad m =>
(a -> m b) -> m a -> m b
(=<<) f
= join . fmap f μB
∘ T(f)
f =
<
<
=
def
=
<
<
Slide 155
Slide 155 text
ࢀߟɿjoin, <=<, =<< ͷؔ
-- from `join`
join :: (Monad m) => m (m a) -> m a
join x = id =<< x
join x = (id <=< id) x
-- from `<=<`
(<=<) :: Monad m => (b -> m c) -> (a -> m b) -> (a -> m c)
g <=< f = \a -> g =<< f a
g <=< f = join . fmap g . f
-- from `=<<`
(=<<) :: Monad m => (a -> m b) -> m a -> m b
f =<< m = (f <=< id) m
f =<< m = (join . fmap f) m
Slide 156
Slide 156 text
wΫϥΠεϦ߹
wϞφυflatMap
ࠨ୯Ґ return >=> g ≡ g
ӈ୯Ґ f >=> return ≡ f
݁߹ (f >=> g) >=> h ≡ f >=> (g >=> h)
ࠨ୯Ґ return a >>= f ≡ f a
ӈ୯Ґ m>>= return ≡ m
݁߹ (m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)
Ϟφυଇ(flatMap / >>=)
(>=>) :: (a -> m b) -> (b -> m c) -> (a -> m c)
(>>=) :: m a -> (a -> m b) -> m b
(<=<)ͷٯ͖
ࠨ͔ΒӈͷΫϥΠεϦ߹
f >=> g =
\a -> f a >>= g