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) に名前を付けているだけである。