Eq
는 타입 클래스이다.
class Eq a where
(==) :: a -> a -> Bool
Eq
인스턴스가 구현되어 있는 데이터 타입이라면 함수 ==
를 쓸 수 있다.
instance Eq Bool where
True == True = True
False == False = True
_ == _ = False
타입 Bool
은 Eq
인스턴스가 있기 때문에 ==
를 쓸 수 있다.
ghci> True == True
True
ghci> True == False
False
Functor
는 타입 클래스이다.
class Functor f where
fmap :: (a -> b) -> f a -> f b
Functor
인스턴스가 있는 타입이라면 함수 fmap
을 쓸 수 있다.
instance Functor Maybe where
fmap _ Nothing = Nothing
fmap f (Just x) = Just (f x)
타입 Maybe
는 Functor
인스턴스가 있어서 fmap
을 쓸 수 있다.
ghci> fmap (+1) (Just 2)
Just 3
ghci> fmap (+1) Nothing
Nothing
사람들은 보통
Maybe
는Functor
야
라고 말한다. 이 말은 사실
타입
Maybe
는 타입 클래스Functor
의 인스턴스가 구현되어 있어
라는 말과 같다.
그러니까 사람들이
A는 모나드야
라고 말한다면 그건
타입
A
는 타입 클래스Monad
의 인스턴스가 구현되어 있어
라는 뜻이다.
그렇다. 모나드는 부리또가 아니라 그냥 타입 클래스일 뿐이다.