Added MaybeT monad transformer to utils/Maybes
authorTwan van Laarhoven <twanvl@gmail.com>
Thu, 17 Jan 2008 20:20:51 +0000 (20:20 +0000)
committerTwan van Laarhoven <twanvl@gmail.com>
Thu, 17 Jan 2008 20:20:51 +0000 (20:20 +0000)
compiler/utils/Maybes.lhs

index 1d43365..d4f8346 100644 (file)
@@ -17,6 +17,7 @@ module Maybes (
         expectJust,
         maybeToBool,
 
+        MaybeT(..)
     ) where
 
 import Data.Maybe
@@ -82,6 +83,26 @@ orElse :: Maybe a -> a -> a
 Nothing  `orElse` y = y
 \end{code}
 
+%************************************************************************
+%*                                                                     *
+\subsection[MaybeT type]{The @MaybeT@ monad transformer}
+%*                                                                     *
+%************************************************************************
+
+\begin{code}
+
+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 . Just
+  x >>= f = MaybeT $ runMaybeT x >>= maybe (return Nothing) (runMaybeT . f)
+  fail _ = MaybeT $ return Nothing
+
+\end{code}
+
 
 %************************************************************************
 %*                                                                      *