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

IO Monad を自分で作る


Shinji KONO / Tue May 31 17:17:48 2011