category theory for programmers 3
category_theory引き続きcategory theory for programmersを読んでいるので続き。
代数的データ型
a
, b
が型だとして、(a, b)
という直積の型を考える。これは、集合の圏の世界で、productになっているのだった。
同様に、a | b
あるいはhaskel風に書くならEither a b
という直和型を考える。これは、集合の圏の世界で、coproductになっている。
で、productは名前の通り、「積」のように振る舞い、coproductは「和」のように振る舞う。
さらに、Void
=値を1個も持たない型(=要素を1個も持たない集合)が、coproductの単位元0のように振る舞い、
Unit
=値を1個だけ持つ型が、productの単位元1のように振る舞う。
〜のように振る舞うというのを、もう少し具体的に言うと、任意の型a
に対して、Void
との積を考えると、Void
とisomorphicになるということである。(a, Void)
型の値というのは、a
型の値とVoid
型の値のペアだが、Void
型の値というものはないので、結果、(a, Void)
型の値というものも作れない。よって、Void
と同じ構造とみなせる。
こんな調子で、たとえば数であれば分配則a * (b + c) = a * b + a * c
が成り立つわけだが、同じように、型の世界でも、(a, Either b c)
とEither (a, b) (a, c)
は同じ構造とみなせるというようなことが書いてある。同じ構造とみなせるつうのは、つまり、isomophicだっつうこと。それは圏論の言葉で言うと、両者の間に、f . g = id, g. f = id
となるような射(関数)が存在するということ。
で、数の演算との対応関係だけでなくて、bool代数のand, orとの対応関係(こいつらも積と和みたいなもんだったね)も考えることができて、それを深ぼってくと、論理学と型理論との対応関係になるんだとか。Curry-Howard isomorphismというらしい