すごい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
が、引数に取る型が決まってる時は型引数は使わない方がいい。型シグネチャが複雑になるから。
今回だと、各フィールドが取る型は決まってるので型引数を使わなくていい。
型クラス制約はデータ宣言に使わない。結局関数で型クラス制約をつけることになるし、必要ないところにまでつける羽目になるから。