[Haskell-beginners] my ugly code and the Maybe monad
Jan Jakubuv
jakubuv at gmail.com
Thu Aug 20 06:29:24 EDT 2009
On Wed, Aug 19, 2009 at 11:57:47PM +0100, Simon Parry wrote:
> Thanks Jan, very helpful and you're right I am just trying to combine 2
> lists; one with 'wrapped' values, one without.
>
> > You can write your own version of `liftM2` (from
> > `Control.Monad`) like this:
> >
> > liftM2snd f a mb = do { b <- mb; return (f a b) }
> >
>
> so the b <- mb bit is 'unwrapping' the Maybe b to use it with the pure
> function f?
That's correct. In fact it is just a syntactic abbreviation (sugar) for
liftM2snd f a mb = mb >>= \b -> return (f a b)
You can always rewrite expressions with `do` using just `>>=`, `>>`, and
`->`. (Note that `<-` becomes the “dot” `->`.)
> I guess I didn't realise this as I've only seen it in the IO monad, but
> naturally it would work with all monads.
>
> > You can verify that
> >
> > liftM2snd == (fmap .)
>
> if I look at this in GHCi the liftM2snd acts over monads and the (fmap .) acts over functors.
> Now I'm still trying to get comfortable with simple monad manipulations so maybe I should just
> read this as functors are equivalent to monads and not worry too much about it yet?
> With that in mind fmap acts to map some pure function over a 'wrapped' value?
>
Every Monad is automatically a Functor as well. You can define `fmap` using
monadic operations:
fmap f ma = ma >>= return . f
Anyway, for some reasons this is not done automatically. You can do it
automatically with some GHC extensions. Load this into GHCi (don't forget
the first line):
{-# OPTIONS -XFlexibleInstances -XUndecidableInstances #-}
instance Monad m => Functor m where
fmap f ma = ma >>= return . f
And here we go (in my GHCi 6.10.4):
*Main> :t fmap
fmap :: (Monad f) => (a -> b) -> f a -> f b
Usually, however, you don't need to do this because all instances of Monad
are already instances of Functor.
Also note that
fmap :: (Functor f) => (a -> b) -> f a -> f b
holds as well, that is, the type of `fmap` is ambiguous (because of the
GHC extensions above).
Sincerely,
Jan.
--
Heriot-Watt University is a Scottish charity
registered under charity number SC000278.
More information about the Beginners
mailing list