前回のまとめからかなり時間が経ってしまった。勉強会が硬直状態にあるので一気にまとめてしまって何とかしたい。
2章は型について。
Explicit Type Declaration
数値や真偽だけでなく、関数も型を持つ。(型は大文字始まりの名前がつく。)
:t 'a' -- 'a' :: Char :t False -- False :: Bool :t myfunc -- myfunc :: Int -> Int -> Int
など。引数、戻り値は->
で区切る。
Common Haskell Types
山田先生のブログに貼ってあった画像が分かりやすい。
黄色に塗られたものが型である。外についてるラベルは型クラス。
Int, Integer, Float, Double, Bool, Char, (), (,), Orderingなどいろいろある。
Integerは他の言語と違って、任意の大きさの整数を表す。タプルも型で、要素の数が異なれば違う型になる。空のタプル()もひとつだけ値を取る型。
Type Variables
head :: [a] -> a
ここでのaは型変数と呼ばれ、型そのものではなく、任意の型を取れる。型変数を使った関数は多相的関数と呼ばれる。
Type Classes 101
型クラスは何らかの振る舞い(関数=メソッド)を定義するインターフェース。型を型クラスのインスタンスにすることでその振る舞いをできるようにする。
型クラス制約: 型の定義で=>
より前の部分。
:t (==) -- (==) :: (Eq a) => a -> a -> Bool
- Eq型クラス
- Ord型クラス
大小比較を定義する。compare関数は比較した結果をGT, LT, EQで返す。
:t compare -- compare :: (Ord a) => a -> a -> Ordering
- Show型クラス: 文字列を返す。
- Read型クラス
Showの逆の型クラス。read関数はインスタンス型の値を返す(場合によっては自分で指定する必要あり)。
read "[1, 2, 3]" ++ [3] -- [1, 2, 3, 3] read "12" :: Int -- 12 read "12" :: Double -- 12.0
- Enum型クラス
順番に列挙できるもの。
['a'..'e'] -- ['a', 'b', 'c', 'd', 'e']
- Bounded型クラス
上限、下限があるもの。
minBound :: Int -- -9223372036854775808(環境によって異なる)
- Num型クラス 実数として振る舞える。
5 * (2 :: Integer) -- 10
- Floating型クラス
FloatとDoubleを含む。
:t sin 10 -- sin 10 :: Floating a => a :t sin 10 :: Double -- sin 10 :: Double :: Double
浮動小数点演算をする関数はFloating型クラスで定義する。