# Difference between revisions of "New monads/MaybeT"

From HaskellWiki

(Added Category:Code) |
m (Missing [ for Category:Code) |
||

Line 38: | Line 38: | ||

-- (Add other MTL instances, and a MonadFix instance) | -- (Add other MTL instances, and a MonadFix instance) | ||

− | [Category:Code]] | + | [[Category:Code]] |

## Revision as of 11:37, 5 February 2007

The Maybe monad deserves a transformer, just like the other classic monads.

## The code

{-# OPTIONS_GHC -fglasgow-exts #-}

module Control.Monad.Maybe

(MaybeT(runMaybeT), module Control.Monad, module Control.Monad.Fix, module Control.Monad.Trans)

where

import Control.Monad import Control.Monad.Fix import Control.Monad.Trans import Control.Monad.State

newtype MaybeT m a = MaybeT {runMaybeT :: m (Maybe a)}

instance Functor m => Functor (MaybeT m) where

fmap f x = MaybeT $ fmap (fmap f) $ runMaybeT x

instance Monad m => Monad (MaybeT m) where

return = MaybeT . return . return x >>= f = MaybeT $ runMaybeT x >>= maybe (return Nothing) (runMaybeT . f) fail _ = MaybeT $ return Nothing

instance Monad m => MonadPlus (MaybeT m) where

mzero = MaybeT $ return mzero mplus x y = MaybeT $ liftM2 mplus (runMaybeT x) (runMaybeT y)

-- Provide other MTL instances, for convenience

instance MonadTrans MaybeT where

lift = MaybeT . liftM return

-- (Add other MTL instances, and a MonadFix instance)