構造体のような型を定義してみる


data Person = Person { name :: String, age :: Int}

instance Eq Person where
(Person name1 age1) == (Person name2 age2) = (name1 == name2)
&& (age1 == age2)
instance Show Person where
show (Person name age) = "Person name=" ++ name ++
" age="++(show age)

Prelude> :load person.hs
[1 of 1] Compiling Main ( person.hs, interpreted )
Ok, modules loaded: Main.
*Main> Person "hoge" 12
Person name=hoge age=12

*Main> name $ Person "hoge" 12
"hoge"

*Main> age $ Person "hoge" 12
12

Eq instance があるので == 関数を呼べる。

 
*Main> let a = Person "hoge" 12
*Main> let b = Person "hoge" 12
*Main> a
Person name=hoge age=12
*Main> b
Person name=hoge age=12
*Main> a == b
True
*Main> b{name="taro"}
Person name=taro age=12
*Main> let taro= b{name="taro",age=35}
*Main> taro
Person name=taro age=35

deriving を使えば instance を宣言しなくてもおk。


data Person = Person { name :: String, age :: Int}
deriving (Eq, Ord, Show)

Prelude> :load person.hs
[1 of 1] Compiling Main ( person.hs, interpreted )
Ok, modules loaded: Main.

*Main> Person "hoge" 12
Person {name = "hoge", age = 12}

*Main> let a = Person "hoge" 12
*Main> let b = Person "hoge" 12
*Main> a == b
True

階層構造になっているデータ。


data Person = Person { name :: String, age :: Int}
deriving (Eq, Ord, Show)

data Employee = Employee { person:: Person, code :: Int }
deriving (Eq, Ord, Show)

*Main> :load person.hs
[1 of 1] Compiling Main ( person.hs, interpreted )
Ok, modules loaded: Main.
*Main> let e = Employee { person = Person {name="taro",age=20 }, code= 12124 }
*Main> e
Employee {person = Person {name = "taro", age = 20}, code = 12124}

各要素を取得してみる。


*Main> person e
Person {name = "taro", age = 20}
*Main> code e
12124
*Main> name $ person e
"taro"
*Main> age $ person e
20