02.05.2013 Views

圏 論 に よ る プログラミング と 論 理

圏 論 に よ る プログラミング と 論 理

圏 論 に よ る プログラミング と 論 理

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!