M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

Haskellのコンストラクタとデータ型

『Real World Haskell』を読んでいて「へー、そーなの」と思った一節。Javaなんかに慣れていると、型の名前(型コンストラクタ)とコンストラクタの名前(値コンストラクタ)を区別しなくなっちゃうんだよね。

Real World Haskell

Real World Haskell

新しいデータ型を定義する

リストやタプルは便利ですが、自分で新しいデータ型をつくる必要があることもしばしばでしょう。データ型を定義することでプログラムのなかで使用する値のあつまりを構造化することができます。匿名のタプルを使うかわりに、関連する値のあつまりに名前と特別な型を持たせることができるのです。型を定義することはまた、プログラムコードの型安全性をより高めることにもなります。プログラマが構造的には似ていても名前の異なる2つの型の値をまちがって混同してしまうことをHaskellは防いでくれます。

とっつきやすくするため、小さなオンライン書店で管理することになるいくつかのデータ型を想像してみましょう。完全性を求めたりあまりに現実的なデータ定義を試みることはやめておきましょう。けれども最低限現実世界に即したかたちで。

新しいデータ型を定義するためにはdataキーワードを使用します。

-- file: ch03/BookStore.hs
data BookInfo = Book Int String [String]
                deriving (Show)

dataキーワードのあとのBookInfoが新しい型名です。BookInfoを型コンストラクタと呼びます。一度型を定義すると、プログラマはそれを使って型を参照できるようになります。すでにお話ししたとおり、型名は、そして型コンストラクタは、大文字で始まる名前でなくてはなりません。

これに続くBookは値コンストラクタと呼ばれます(データコンストラクタとも呼ばれます)。プログラマはこの値コンストラクタをBookInfo型のデータを作成するのに使用します。値コンストラクタの名前もまた大文字で始まる必要があります。

Bookのあとには、Int、String、そして[String]〔Stringを要素とするリスト〕が続いていますが、これが型を構成する部品です。これらのコンポーネントは他のプログラミング言語におけるクラスや構造体のフィールドと同じ意味を持ちます。これは値を保管しておく「スロット」です。(プログラマはこれらのコンポーネントをフィールドとして参照することになります。)