Functor => Pointed => Applicative => Monad

wren ng thornton wren at freegeek.org
Tue Nov 30 06:39:31 CET 2010


On 11/29/10 8:58 AM, Maciej Piechotka wrote:
>> class Pointed f =>  Applicative f where
>>       (<*>) :: f (a ->  b) ->  f a ->  f b
>>       (*>) :: f a ->  f b ->  f b
>>       (<*) :: f a ->  f b ->  f a
>
>      a *>  b = flip const<$>  a<*>  b
>      a<* b = const<$>  a<*>  b

I assume you're meaning default implementations, rather than that they 
should be removed from the class? (the reason to be in the class is 
performance issues.)


>> class Applicative m =>  Monad m where
>>       (>>=) :: m a ->  (a ->  m b) ->  m b
>>       (>>) :: m a ->  m b ->  m b
>>       join :: m (m a) ->  m a
>>
>>       f>>= x = join (fmap f x)
>>       m>>  k = m>>= \_ ->  k
>>       join x = x>>= id
>>
>> This would eliminate the necessity of declaring a Monad instance for every Applicative, and eliminate the need for sets
>> of duplicate functions such as [fmap,liftM,map,liftA], [(<*>),ap], and [concat,join].
>
> Technically (>>) and (*>) are duplicates assumin (<*>) and ap are, I
> believe:

Yes. Assuming the free applicative instance from the monad ---with 
pure=return; (<*>)=ap--- then (>>) = (*>).

Due to legacy reasons it might be nice to keep both names around since 
(>>) looks like (>>=), whereas (*>) looks like (<*>) and the related 
(<*) ---which is not (<<). Perhaps we should just move (>>) out of Monad 
via:

     (>>) :: (Monad m) => m a ->  m b ->  m b
     (>>) = (*>)

Which fits with (=<<), (<<), (<=<), and (>=>) being outside of the class 
too.

-- 
Live well,
~wren


More information about the Libraries mailing list