적어도 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
하는 것이 현명한 일 이므로 이것을 고려할 수도 있습니다.