#2309: containers: specialize functions that fail in a Monad
apfelmus at quantentunnel.de
Wed May 28 05:21:01 EDT 2008
Ross Paterson wrote:
> Several functions on containers used to have types like
> lookup :: (Ord k) => k -> Map k a -> Maybe a
> but these were generalized to
> lookup :: (Monad m, Ord k) => k -> Map k a -> m a
> The proposal is to change these signatures back, specializing them
> to Maybe.
I'm all for Maybe in the question Monad VS Maybe.
Concerning MonadZero VS Maybe, the first observation is of course that
both approaches have the same expressiveness,
lift :: MonadZero m => Maybe a -> m a
lift = maybe mzero return
unlift :: (forall m . MonadZero m => m a) -> Maybe a
unlift = id
are inverse to each other. In other words, Maybe has a universal
property (this sounds much fancier than it really is).
So, the only decision here is whether the library should factor things
via Maybe or include an automatic lift for extra convenience. I'm not
sure whether this convenience is actually used, can someone dig up
statistics from hackage?
Also, it's not entirely clear whether MonadZero is the most general
abstraction. Is ApplicativeZero better? Or something else?
In any case, I prefer Maybe here as well because it's straightforward
and simple. Every other abstraction is just a lift away.
More information about the Libraries