On 15 Apr 2009, at 00:08, Arthur Chan wrote:
You know, I was wondering... if Monads are a subset of Functors, and Applicative is a subset of Functors, and Monads are a subset of Applicative... shouldn't it be possible to tack on the definitions that automatically derive Functor and Applicative? Isn't it the case that there is really only one way to define Applicative for a Monad anyway? And isn't there only one way to define fmap for a Monad that makes sense?
Yes, but at the same time no. Firstly, it's possible that you want an applicative instance that disagrees with your monad one – not common, and usually ugly, but possible. Secondly, it's often possible to implement the applicative/functor methods in a much more efficient way by dealing with them specifically. In reality, what we want to see is this: class Pointed f where pure :: a -> f a class Functor f where fmap :: (a -> b) -> f a -> f b class (Functor f, Pointed f) => Applicative f where (<*>) :: f (a -> b) -> f a -> f b class (Applicative f) => Monad f where join :: f (f a) -> f a Then we only need to define each behavior in one place, and the tree is neatly seperated out so that if we have something that isn't an Applicative, we can stop implementing after Functor, and if we have something that isn't a Monad, we can stop implementing after Applicative. Bob