
Understood. Thanks.
A little further on in the tutorial they define a "parent" function.
The mplus operator is used to combine monadic values from
separate computations into a single monadic value. Within the context
of our sheep-cloning example, we could use Maybe's
mplus to define a function,
parent s = (mother s) `mplus` (father s),
which would return a parent if there is one, and Nothing is the sheep has no parents at all.
For a sheep with both parents, the function would return one or the
other, depending on the exact definition of mplus in the
Maybe monad.
But I get this when I try to use it:
sheep.hs:30:22: Not in scope: `mplus'
[michael@localhost ~]$
And here's the sheep.hs file, attempting to use "parent" near the bottom
=========
{- Author: Jeff Newbern
Maintainer: Jeff Newbern
Since I'm trying to learn Monads, let's look at this as a teaching moment. The example code (see below), which I pulled off YAMT (Yet Another Monad Tutorial ;-)), is the source of my 'comb' function.
I understand the code as it now stands, and I understand that the Prelude (>>=) would replace the 'comb'. Adding whatever statements are needed, how would you "specialize" the (>>=) to Maybe and solve this particular problem.
Saying that "comb is just (>>=) specialized to Maybe" just means that you can define comb like this: comb :: Maybe a -> (a -> Maybe b) -> Maybe b comb = (>>=) Which also of course means that you can typically use (>>=) instead of comb. Although in some cases, being more specific about the type can be useful. You can do this sort of specialization for any polymorphic function, e.g.: -- id is predefined in Haskell, definition given as example id :: a -> a id x = x intID :: Int -> Int intId = id In that case, the compiler basically specializes the function for you, providing a version of it that's specific to Ints. However, (>>=) is defined by the Monad type class, and as it happens there's also already a definition for it that's specific to the Maybe type. You can see GHC's source for it here: http://haskell.org/ghc/docs/latest/html/libraries/base/src/Data-Maybe.html#M... Not surprisingly, that definition is essentially identical to the definition of comb: (Just x) >>= k = k x Nothing >>= _ = Nothing So defining "comb = (>>=)" just uses that definition. Anton _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe