Monads and Maybe

Jon Cast jcast@cate0-46.reshall.ou.edu
Thu, 21 Aug 2003 15:26:51 -0500


Konrad Hinsen <hinsen@cnrs-orleans.fr> wrote:

> I have been following the recent "Monad tutorial" discussion with
> interest, and even read the tutorial, which is a useful addition to
> the existing Haskell documentation. So useful in fact that it raises a
> question...
> 
> The whole monad mechanism seems to geared towards functions of one
> argument, plus eventually state, that get chained together. How about
> functions with several arguments?
> 
> As an example, I'll use the Maybe monad. Suppose I want to write code
> to handle experimental data, in which there might be missing values. I
> might then decide to represent measurements by data of type "Maybe
> Double", with missing values represented by "Nothing". I could then go
> on to define functions on missing values, which would return "Nothing"
> when their argument is "Nothing", and I could string these functions
> together via the monad mechanism. Fine.  But how would I handle
> e.g. addition of two such values?  The result should be "Nothing" when
> either of its arguments is "Nothing". Is there any mechanism to handle
> that?

Yes.  Many complicated proposals have been made, but there's a
straightforward, general mechanism:

> addMaybe :: Num alpha => Maybe alpha -> Maybe alpha -> Maybe alpha
> addMaybe a b = a >>= \x ->
>                b >>= \y ->
>                return (x + y)

or

> addMaybe a b = do
>   x <- a
>   y <- b
>   return (x + y)

(Incidentally, monads in Haskell are specified slightly differently than
the Categorical version to enable precisely this sort of pattern.)

Jon Cast