レコード

レコードは代数的でないデータ型。C の構造体のようなもの。うまい例を思いつかないから,本に載ってるのをそのまま書くとこんな感じ。

data Point = Pt {x :: Integer, y :: Integer}

x,y をフィールドといい,それぞれ Integer 型の値を取る。具体的に値を定義するにはこうする。

Pt { x = 1, y = 4 }

代数的データ型を使っても同じようなことはできる。データ構成子が複数の引数を取ることにすればいいし,タプルにしてもいい。これらとレコードが違うのは2点。

  • 名前がついているのでわかりやすい。
  • フィールド名が,同時にフィールドにアクセスするための関数になっている。

2つ目のほうはこんな感じだ。

*Main> x Pt {x = 2, y = 3}
2

x という関数が定義されてるってことだな。

*Main> :t x
x :: Point -> Integer

さて,じゃあおなじフィールド名を持つレコードを宣言するとどうなるか。

data TP = Tp { x :: Int, y :: Int } deriving (Eq, Show)

data Point = Pt { x :: Integer, y :: Integer } deriving (Eq, Show)

これを GHCi にロードすると

Prelude> :l record.hs
Compiling Main             ( record.hs, interpreted )

record.hs:3:18:
    Multiple declarations of `Main.x'
    Declared at: record.hs:1:15
                 record.hs:3:18

record.hs:3:32:
    Multiple declarations of `Main.y'
    Declared at: record.hs:1:25
                 record.hs:3:32
Failed, modules loaded: none.

あー,やっぱりだめなわけね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください