人気ブログランキング | 話題のタグを見る

RWH の読み方(12) 第3章

Defining a New Data Type

Real World Haskell 第3章 Defining Types, Streamlining Functions の Defining a New Data Type はユーザ定義のデータ型の定義方法の解説だ。

例としてオンライン書店の書籍情報のデータ型の定義をしている。データベースのレコードに相当するデータ構造で書籍のID番号と、書籍名と、書籍の付帯情報の3つのフィールドからなっている。Haskell での定義は次のようになる。

data BookInfo = Book Int String [String]
  deriving (Show)

上の定義で、data はユーザ定義のデータを作るときのキーワードだ。data の後の BookInfo が新しいデータ型の名前だ。BookInfo は a type constructor だ。a をつけるのは日本語的ではないが、英語の文章を読むときは a を意識していたほうが読みやすくなる。a がでてきたら、何かわからないが1つ2つと数えられるものがひとつあるというイメージを持つとあとの部分の理解がはやくなる。閑話休題。型名は大文字ではじめるように決められている。

等号の後の Book は、the value constructor あるいは a data constructor とよばれる。BookInfo は BookInfo 型全般を指す総称だが、Book は、BookInfo 型の個々のデータ(レコード)を作成するときに使われる。A value constructor もまた大文字で書き始める必要がある。

Book のあとの、the Int, String, and [String] は BookInfo 型の the components だ。また余談になるが the という定冠詞がついたものは、あれとかこれとか指し示す事ができる。一方 a というのは漠然とした概念的なイメージなので、これがそうだと指し示すことはできない。the components は他の言語の構造体やクラスのフィールドに相当する。a component は a slot と呼ばれることもある。RWH ではしばしば components を fields と呼んでいる。

a といったり the といったり自分で読み返してみても煩わしいが、日本語にはない感覚なので使ってみるもの勉強になるのではないかと思う。

the components の Int は書籍のIDの型で、Stringは書籍のタイトルの型で、[String] は書籍の著者名のリストだ。

BookInfo の the components の情報は3要素のタブル (Int, String, [String]) と本質的には同じだが、タプルのデータは無名であるのに対し、BookInfo のデータは書籍情報であると明示することになる。

したがって、BookInfo 型と全く同じ構造をしている次のような MagazineInfo 型があったとしても、

data MagazineInfo = Magazine Int String [String]
  deriving (Show)

BookInfo 型のデータを MagazineInfo 型のデータとして使うことはできない。型をきちんと区別することで思わぬ副作用の影響をうけるのを未然に防ぐ事になる。

これだけのためでも、構造のあるデータをタプルを使わずにユーザ定義の型を定義して使う理由がある。

ところで、上の定義の deriving は何かという疑問がわくが、あとの章で説明される。deriving (Show) を記述していないと data1 = Book 1 "title" ["author1", "author2"] で BookInfo 型のデータを作っても、print data1 として中を見ることができない。ghci では式を一行入力するたびに評価されて print で表示されるので、print で表示できないデータがあるとエラー表示されてしまう。ユーザ定義の型を定義した際に最初に陥る落とし穴だ。

BookInfo型のデータは the value constructor の Book を関数として使うことでデータ(レコード)を作成できる。具体的には次のようにする。

myInfo = Book 9780135072455 "Algebra of Programming"
  ["Richard Bird", "Oege de Moor"]

Defining a New Data Type の後半の部分は、ユーザ定義型の使い方を ghci を使って検証している演習なので省略する。

Naming Types and Values

このサブセクションでは type constructor と value constructor の名前空間が違うので両者を同じ名前にしても良いことについて説明してある。

RHWの書き方は初心者の疑問を無視しないやり方だ、deriving のようなものもお約束や呪文にしないで、できるだけ説明してある。また、ghci を使って実際に動作を確認できるようにしてあるので身につきやすい。プログラムは手を動かして動作を確認するまでは理解出来ないものと考えていたほうがいい。こういうところがこの本の魅力ではないかと思う。
by tnomura9 | 2012-03-02 12:37 | Haskell | Comments(0)
<< Vanilla Mood Japanese Synchr... >>