Haskel のデータ型
Menu Menu入力の型が異なれば、パターンにより、同じ関数でも違う処理が行われる。
データ型で名前を付けたデータの集まりを作れる。
data Mammal = Cat { name :: String, color :: String }
| Dog { name :: String, color :: String }
say (Cat n c) = "myaou"
say (Dog n c) = "bau"
動かすのは、こんな感じ。
*Main> let c = (Cat "mike" "brown")
*Main> say c
"myaou"
*Main> let d = (Dog "pochi" "white")
*Main> say d
"bau"
say を data 型 Mammal の method と見なすことができる。
data の定義の時に、deriving (Show) を付けておく方が便利。
型変数を持つデータ型
特に中身を決めずにデータ型の名前だけを決めることもできる
Mammal s = Cat s
| Dog s
deriving Show
この場合の s は型変数 (type variable)になる。Java にも C++ にも、対応するものがある。
Class
method の型は統一されていた方が良い場合がある。
data Mammal s = Cat s
| Dog s
deriving (Show)
class Say a where
say :: a -> String
instance Say (Mammal s) where
say (Cat s) = "myaou"
say (Dog s) = "bau"
Lambda 式
let f x = x + 1
と、
let f = \x -> x + 1
は同じ。λに似ているので \ を使ったと思われる。引数を一つ取り、それを x に代入して計算する関数を表す。
let で代入するだけだと、
eval られない
つまり let は参照 (reference) に名前を付けているだけである。