15. [プ] Haskellの直積型 (tuple型)
型a, bに対し, それらの直積と呼ばれるtuple型(a, b)が存在し,
tupleの基本的な関数としてfst, sndがあります.
-- | Extract the first component of a pair.
fst :: (a,b) -> a
fst (x,_) = x
-- | Extract the second component of a pair.
snd :: (a,b) -> b
snd (_,y) = y
(https://hackage.haskell.org/package/base-4.9.0.0/docs/
src/Data.Tuple.html#line-33)
→ これに対応する圏論の概念は何でしょう?
Kinebuchi Tomohiko 圏とHaskellの型
16. [圏] 積の復習
圏Cの対象X, Y の積 X × Y, p, q とは, 圏Cの対象X × Y ,
射p : X × Y → X, 射q : X × Y → Y の組で, 次の条件を満たす
ものです.
W
k
}}
∃1
h
l
!!
X X × Yp
oo
q
// Y
(条件) 任意の圏Cの対象Wと射k : W → X, l : W → Y に対し
て, 射h : W → X × Y が1つだけあって
p ◦ h = k
q ◦ h = l
となる.
Kinebuchi Tomohiko 圏とHaskellの型
17. [プ][圏] 直積型がHask圏の積であること
直積型がHask圏の積になるためには次の条件を満たす必要があ
ります.
(条件) a, b, cを任意の型とし, k :: c - a, l :: c - bを任意
の関数としたとき, 関数h :: c - (a, b)があって
fst . h == k
snd . h == l
とできる.
c
k
}}
∃1
h
l
!!
a (a, b)
fst
oo
snd
// b
→ h x = (k x, l x)と実装すれば条件を満たします.
Kinebuchi Tomohiko 圏とHaskellの型
18. [プ] hの例
作為的な例ですが.
k :: (Integer, String, String) - Integer
k (x, _, _) = x
l :: (Integer, String, String) - String
l (_, y, _) = y
h :: (Integer, String, String) - (Integer, String)
h x = (k x, l x)
Kinebuchi Tomohiko 圏とHaskellの型
19. [プ] Haskellの直和型 (Either型)
型a, bに対し, それらの直和と呼ばれるEither型Either a bが存
在し, EitherのコンストラクタとしてLeft, Rightがあります.
data Either a b = Left a | Right b
deriving (Eq, Ord, Read, Show)
(https://hackage.haskell.org/package/base-4.9.0.0/docs/
src/Data.Either.html#Either)
→ これに対応する圏論の概念は何でしょう?
Kinebuchi Tomohiko 圏とHaskellの型
20. [圏] 余積の復習
圏Cの対象X, Y の余積 X Y, i, j とは, 圏Cの対象X Y ,
射i : X → X Y , 射j : Y → Y Y の組で, 次の条件を満たす
ものです.
W
X
k
==
i
// X Y
∃1
h
OO
Y
j
oo
l
aa
(条件) 任意の圏Cの対象Wと射k : X → W, l : Y → Wに対し
て, 射h : X Y → Wが1つだけあって
h ◦ i = k
h ◦ j = l
となる.
Kinebuchi Tomohiko 圏とHaskellの型
22. [プ] hの例
k :: Integer - Integer
k x = 2 * x
l :: Integer - Integer
l x = 3 * x
h :: Either Integer Integer - Integer
h (Left x) = 2 * x
h (Right x) = 3 * x
Haskellのパターンマッチでhを定義しているので, 条件を満たす
ことが分かりやすくなっています.
Kinebuchi Tomohiko 圏とHaskellの型
24. [プ] HaskellのFunctor
定義は以下の通りです.
class Functor f where
fmap :: (a - b) - f a - f b
(https://hackage.haskell.org/package/base-4.9.0.0/docs/
src/GHC.Base.html#Functor)
ある具体的なFunctorをfとして, fの射関数fmapの型を宣言して
います.
(「射関数」= 関手Fが写す対象と射のうち射の方だけを考え
たもの. 射fを射Ffに写す関数のこと.)
Kinebuchi Tomohiko 圏とHaskellの型
26. [プ] HaskellのFunctor則 (Functor law)
Functor則とはFunctorが満たすべき条件. これに反する実装自
体はできるものの, そうするメリットはあまり無いです.
fmap id == id
fmap (f . g) == fmap f . fmap g
(https://hackage.haskell.org/package/base-4.9.0.0/docs/
Data-Functor.html#t:Functor)
このFunctor則の2つの条件が, 関手が満たすべき2つの条件に対
応しています.
→ HaskellのFunctorと圏論での関手に対応
Kinebuchi Tomohiko 圏とHaskellの型
27. [プ] Functorの例: Maybe
Maybeとは, ある型の値がある状態と値がない空の状態をいっ
ぺんに表せる型です. 定義は以下の通りです.
data Maybe a = Nothing | Just a
deriving (Eq, Ord)
(https://hackage.haskell.org/package/base-4.9.0.0/docs/
src/GHC.Base.html#Maybe)
Nothingが「値が無いこと」に対応し,
Just aが「aという型の値があること」に対応しています.
Kinebuchi Tomohiko 圏とHaskellの型
28. [プ] MaybeがFunctor則を満たすこと (1/2)
MaybeのFunctorとしての定義は以下の通りです.
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)
(https://hackage.haskell.org/package/base-4.9.0.0/docs/
src/GHC.Base.html#line-652)
Maybe aについてNothingの場合とJust aの場合のそれぞれで
Functor則を満たすことを確認すれば良いです.
Kinebuchi Tomohiko 圏とHaskellの型
29. [プ] MaybeがFunctor則を満たすこと (2/2)
fmap id Nothing == Nothing
fmap id (Just a) == Just (id a) == Just a
fmap (g . f) Nothing == Nothing
((fmap g) . (fmap f)) Nothing
== fmap g (fmap f Nothing)
== fmap g Nothing
== Nothing
fmap (g . f) (Just a) == Just ((g . f) a)
== Just (g (f a))
((fmap g) . (fmap f)) (Just a)
== fmap g (fmap f (Just a))
== fmap g (Just (f a))
== Just (g (f a))
Kinebuchi Tomohiko 圏とHaskellの型