[Haskell] ANN: monadLib 2.0

Udo Stenzel u.stenzel at web.de
Thu Mar 23 14:08:51 EST 2006

Iavor Diatchki wrote:
> >
> > *> when :: Monad m => m a -> Bool -> m (Maybe a)
> >
> I am not sure if this would be useful.  If you cared about the result
> you would have to write:
> do { x <- when p m; case x of { Just a -> e1; Nothing -> e2. }

...unless you wanted the result in the form of a Maybe.  Since there
really is no other sensible choice for the "False" branch, I contend
that _if_ you want the result at all, you want is as a maybe.  If not,
well, then ignoring (Maybe a) isn't any harder than ignoring (); (>>)
already accomplishes that.

> A simpler and (probably) more efficient way to write the above is:
> do { if p then do { a <- m; e1} else e2 }

But usually p comes from a monadic computation, so in reality you need

*> do { p' <- p ; if p' then do { a <- m ; e1 } else e2 }

which I find excessively ugly.  Actually this is not a case for when,
it's one for cond:

*> cond t f True = t
*> cond t f False = f

*> p >>= cond (do { a <- m ; e1 }) e2

> The main point of this discussion has been:
>  (i) Should the ignoring be done silently in the library, or
>  (ii) should the programmer be explicit (i.e., write 'm >> return ()').

I just think that both options are wrong.

(iii) should the programmer be explicit (ie. write 'when p m >>')

Das Elend hat viele Gesichter, wie gefällt Ihnen meins?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
Url : http://www.haskell.org//pipermail/libraries/attachments/20060323/97b2cdff/attachment.bin

More information about the Libraries mailing list