Proposal: Applicative => Monad: Call for consensus

Henning Thielemann lemming at henning-thielemann.de
Thu Jan 20 21:26:53 CET 2011


Sittampalam, Ganesh schrieb:
> Bas van Dijk wrote:
>> Just for clarity, are you referring to the restricted monads from the
>> rmonad package[1]? 

yes

>> If so, I see no reason (yet) why the RMonad type class can't be
>> defined as: 
>>
>> class RMonad m where
>>    join :: Suitable m a => m (m a) -> m a
>>
>> Where the Set instance becomes:
>>
>> instance RMonad Set where
>>    join ss = withResConstraints $ \SetConstraints -> fold union empty ss 
> 
> I haven't tried it, but I think you'd need Suitable m (m a) in the
> constraints, either of join itself, or of (>>=) to make the default
> definition typecheck.
> 
> I ran into similar problems with trying to make RApplicative. Many of
> the Applicative combinators use intermediate functions heavily, leading
> to a need for Suitable m (a -> b) for various a and b, and there are
> often multiple different possible definitions of the combinators that
> lead to different constraints being needed.

I tried the same and got the same problems. My favorite example is a
list like monad on StorableVector.

Suitable StorableVector a

means

Storable a

and there is no

Storable (a -> b)


I could define an RApplicative class only if I introduced an auxiliary
type, in the example a stream-fusion:Stream. Then I could define a
ZipList instance for StorableVector by converting each StorableVector to
Stream and the zipped resulting Stream back to StorableVector.




More information about the Libraries mailing list