すごいHaskell七章(後半 7.4まで)

型コンストラクタ・型引数

data Maybe a = Nothing | Just a

 ここでの Maybe が型コンストラクタ。 a は型引数。 Maybe が型引数に型を受けとることで、 Maybe Int, Maybe Char などの型を作ることが出来る。例えば、 Just 1 の型は Num a => Maybe a …これは分かりづらい。 Just ['a'] の型は Maybe [Char] 。
 Nothing の型は Maybe a で多層的なので、Maybe なにがし型が要求されるところにはどこでも入れられる。


 []型の値は作れないっていうの面白いなー確かになー。
 具体型は、Int, Char, [Int], Maybe Charみたいなの。値を持てる型。


 型引数ってつまり、ジェネリックスってことなのかな。

型引数、型クラス制約をつけるべきでないとき

 商品を表す型 Item と、値段の合計を計算する sumPrice 関数を考える。

data Item = { name :: String
              price :: Int
              code :: Int  #商品コード的なイメージ
            } deriving(Show)


sumPrice :: [Item] -> Int
sumPrice xs = sum $ map price xs

 レコード型も型引数をとれる。

data Item a b c = Item { name :: a 
            , price :: b
	    , code :: c
	    } deriving (Show)

sumPrice :: (Num a) => [Item String a Integer]  -> a
sumPrice xs = sum $ map price xs 

 が、引数に取る型が決まってる時は型引数は使わない方がいい。型シグネチャが複雑になるから。
 今回だと、各フィールドが取る型は決まってるので型引数を使わなくていい。



 型クラス制約はデータ宣言に使わない。結局関数で型クラス制約をつけることになるし、必要ないところにまでつける羽目になるから。