多相

「何でも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を再実装している

だそうだ。

とりあえずメモメモ

後で具体的なクラス作るお