圏 論 に よ る プログラミング と 論 理
圏 論 に よ る プログラミング と 論 理
圏 論 に よ る プログラミング と 論 理
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
第 3 章 データ型の構成<br />
前章では単純型付きラムダ計算<strong>に</strong>ついて概説しましたが, この章では型<br />
<strong>に</strong>ついてさら<strong>に</strong>掘り下げます.<br />
代数的データ型<br />
関数型<strong>プログラミング</strong>⾔言語では, 新たなデータ型の定義<strong>に</strong>代数的データ<br />
型 (algebraic data type) <strong>と</strong>呼ばれ<strong>る</strong>ものを⽤用います. ここでは Haskell<br />
の代数的データ型を例<strong>に</strong>取ります. 次の<strong>よ</strong>う<strong>に</strong>して (⽚片⽅方向の) リストを<br />
定義できます.<br />
data List a = Cons a (List a) | Nil<br />
代数的データ型<strong>に</strong>は型の引数を持たせ<strong>る</strong>こ<strong>と</strong>ができます. List は引数で<br />
あ<strong>る</strong>型 a を受け取って初めて型<strong>に</strong>な<strong>る</strong>ので, ⼀一種の関数の<strong>よ</strong>うなものだ<strong>と</strong><br />
考えられます. た<strong>と</strong>えば List Int は Int 型の要素を持つリストのこ<strong>と</strong>です.<br />
また, Cons や Nil <strong>と</strong>いうのはデータを構築す<strong>る</strong>ためのもので, データ構<br />
築子 (data constructor) <strong>と</strong>いいます. Cons の場合, 型 a の値<strong>と</strong>型 List a<br />
の値を元<strong>に</strong>して新た<strong>に</strong>型 List a のデータを作ります. Nil の場合, 何も受け<br />
取らず<strong>に</strong>データを作ります. Cons や Nil もやはり⼀一種の関数の<strong>よ</strong>うなもの<br />
だ<strong>と</strong>考えられます.<br />
代数的データ型を使う際, 多くの⾔言語<strong>に</strong>おいてパターンマッチ<br />
(pattern matching) が可能です. この機能<strong>に</strong><strong>よ</strong>って, データを「パターン」<br />
<strong>と</strong>して⾒見<strong>る</strong>こ<strong>と</strong>ができます. た<strong>と</strong>えば, リストの⼀一番初めの値を得たくて,<br />
なおかつリストが空だった<strong>と</strong>き<strong>に</strong>デフォルト値を得たい<strong>と</strong>いう<strong>よ</strong>うな場<br />
合, Haskell では<br />
headOrDefault :: a -> List a -> a<br />
headOrDefault d (Cons x xs) = x<br />
headOrDefault d Nil = d<br />
<strong>と</strong>書けばいいです.<br />
代数的データ型の特殊なもの<strong>と</strong>して, 直積<strong>と</strong>直和が考えられます.<br />
-- a×b<br />
data Prod a b = Pair a b<br />
fst' :: Prod a b -> a<br />
fst' (Pair x y) = x<br />
snd' :: Prod a b -> b<br />
203