少なくともHaskellの型クラスに注意することをお勧めします。型クラスは、演算子のオーバーロードに対する規律あるアプローチとなるように作成されましたが、他の用途を見つけており、ある程度までHaskellを作りました。
たとえば、アドホックオーバーロードの例は次のとおりです(まったく有効なHaskellではありません)。
(==) :: Int -> Int -> Bool
x == y = ...
x /= y = not (x == y)
(==) :: Char -> Char -> Bool
x == y = ...
x /= y = not (x == y)
そして、型クラスでオーバーロードする同じ例です:
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
x /= y = not (x == y)
instance Eq Int where
x == y = ...
instance Eq Char where
x == y = ...
これの欠点は、あなたがすべてのあなたの型クラスのためのファンキーな名前を思い付くしなければならないということである(Haskellのと同様に、あなたはかなり抽象的なを持っているMonad
、Functor
、Applicative
だけでなく、よりシンプルかつ認識Eq
、Num
とOrd
)。
利点は、型クラスに慣れたら、そのクラスで任意の型を使用する方法を知っていることです。さらに、次のように、必要なクラスを実装しない型から関数を簡単に保護できます。
group :: (Eq a) => [a] -> [[a]]
group = groupBy (==)
編集: Haskellでは、==
2つの異なる型を受け入れる演算子が必要な場合、マルチパラメータ型クラスを使用できます。
class Eq a b where
(==) :: a -> b -> Bool
(/=) :: a -> b -> Bool
x /= y = not (x == y)
instance Eq Int Int where
x == y = ...
instance Eq Char Char where
x == y = ...
instance Eq Int Float where
x == y = ...
もちろん、リンゴとオレンジを明示的に比較できるため、これはおそらく悪い考えです。ただし、一部のコンテキストではにを+
追加するのWord8
がInt
賢明なことなので、についてこれを検討することをお勧めします。