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