多相
「何でもOK」な多相が「parameter polymorphism」
「一部OK」な多相(制約付多相)が「ad hoc polymorphism」
で制約を付けるのが「(型)クラス」(type class) (≠型)
ad hocの例
「sort」はリストをソートする。
例えば
[2,1,3]
とか
["abc", "ghi", "def"]
とか。
でも、
[putStr, length, head]
とかは、分けわかんない。
で、実際、下みたいにしてやると動かない
import System import List main = print $ unlines $ sort [head, length, last]
sortの定義を見ると
sort :: (Ord a) => [a] -> [a]
となってて、(Ord a)が制約らしい
じゃぁ、Ordの定義を見ると
class (Eq a) => Ord a where compare :: a -> a -> Ordering (<) :: a -> a -> Bool (>=) :: a -> a -> Bool (>) :: a -> a -> Bool (<=) :: a -> a -> Bool max :: a -> a -> a min :: a -> a -> a instance (Ord a) => Ord (Maybe a) instance (Ord a, Ord b) => (Either a b) instance Ord Integer instance Ord Float instance Ord Double instance (Ord a) => Ord [a] instance Ord () instance Ord Char instance Ord Bool instance Ord Ordering instance Ord Int
ってなってる
これの意味するところは
型クラスOrdは、Eqをスーパークラス(Eqのメソッドは全実装)とし、
クラスメソッドとして、compare以下、minまでを表記の定義で受ける。
加えて、instanceを再実装している
だそうだ。
とりあえずメモメモ
後で具体的なクラス作るお