Functor, Applicative, Monad에 대해서 공부했는데요

이 3가지가 서로 포함관계에 있더라고요


그런데 제 생각에는 서로 독립적인 관계에 있게 해놓았어도 충분히 각각을 구현할 수 있을 것 같더라고요

즉 Monad 타입클래스에 대한 특정한 타입의 인스턴스를 만드려고 할 때

return이나 >>=의 정의를 위해 fmap(functor에 필요한)이나 pure 및 <*>(applicative에 필요한)를 반드시 쓸 필요는 없잖아요?

그런데도 위 포함관계 때문에 결국 각 타입클래스에 대한 인스턴스 다 만들어줘야 하더라고요


이 세가지가 원래 수학에서도 포함관계에 있는 것들인가요? 아니면 다른 이유로 이 세가지가 반드시 포함관계에 있어야 하는 것인가요?