적어도 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 = ...
이것의 단점은 당신의 모든 typeclasses에 대한 펑키 이름을 마련 할 필요가 있다는 것이다 (하스켈처럼, 당신은 오히려 추상적이 Monad, Functor, Applicative뿐만 아니라 간단하고 인식 Eq, Num및 Ord).
단점은 일단 typeclass에 익숙해지면 해당 클래스에서 모든 유형을 사용하는 방법을 알고 있다는 것입니다. 또한 다음과 같이 필요한 클래스를 구현하지 않는 유형에서 함수를 쉽게 보호 할 수 있습니다.
group :: (Eq a) => [a] -> [[a]]
group = groupBy (==)
편집 : Haskell에서 ==두 가지 다른 유형을 허용 하는 연산자를 원하면 다중 매개 변수 유형 클래스를 사용할 수 있습니다.
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 = ...
물론 이것은 사과와 오렌지를 명시 적으로 비교할 수 있기 때문에 아마도 나쁜 생각 일 것입니다. 그러나 일부 상황 에서는 실제로 +a Word8를 추가 Int하는 것이 현명한 일 이므로 이것을 고려할 수도 있습니다.