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