haskellと型
haskellの学習を進めるにあたり慣れていない概念が、型。すごH本を参考にまとめてみます。
型変数って?
Haskellでは、式も関数も型が重要である。とくに、関数を定義する際には、明示的に宣言しておいたほうがいい。
しかし、中にはいろいろな型に対して動作する関数がある。試しに、head関数の型を調べる。
ghci> :t head
head :: [a] -> a
aは型変数。どんな型も取りうることを意味する。headの型宣言は「任意の型のリストを引数に取り、その型の要素を一つ返す」と読める。
型変数を用いた関数を多相的関数という。
型クラス、インスタンスって慣れなてないなあ...
ちょっと抽象的で慣れてないので、具体例から考える。
ghci> :t (==)
(==) :: (Eq a) => a -> a -> Bool
=>は、型クラス制約という。
「等値性関数は、同じ型の任意の2つの引数を取り、Boolを返す。引数の2つの値の型はEqクラスのインスタンスでなければならない」と読める。Eq型クラスは、等値性をテストするためのインターフェイスを提供する。
ここで用語を整理します。
型クラス
関数の集まりを定める。なんらかの振る舞いを定義。
インスタンス
その型クラスが記述する振る舞いを実装する。
等値性関数の例で言うなら、ある2つの値の等値性を比較することに意味があるなら、その型はEq型クラスのインスタンスにできる、ということ。
ある型クラスのインスタンスに、ある型がなる、ということに注意。
Eq型クラスで具体例
型が関数を実装しているとは、その関数がその特定の型に対して使われたときに、どういう振る舞いをするか定義するということ。Eqのインスタンスが実装するべき関数は、== と /= である。
Eqの様々なインスタンス(=型)に対する == と /= の動作が定義される。
ghci> 5 == 5
True
ghci> 5 /= 5
False
ghci> 'a' == 'a'
True
ghci> "Ha Ha" == "Ha Ha"
True