control-monad-free (empty) → 0.1
raw patch · 3 files changed
+41/−0 lines, 3 filesdep +basedep +mtlsetup-changed
Dependencies added: base, mtl
Files
- Control/Monad/Free.hs +26/−0
- Setup.hs +2/−0
- control-monad-free.cabal +13/−0
+ Control/Monad/Free.hs view
@@ -0,0 +1,26 @@+module Control.Monad.Free (FreeT(..)) where++import Control.Applicative+import Control.Monad (liftM)+import Control.Monad.Trans++{- | @FreeT f@ is a monad transformer for free monads over a functor @f@. +-}+newtype FreeT f m a = FreeT { runFreeT :: m (Either a (f (FreeT f m a))) }++editEither l r = either (Left . l) (Right . r)+conj f = FreeT . f . runFreeT++instance (Functor f, Functor m) => Functor (FreeT f m) where+ fmap f = conj $ fmap (editEither f ((fmap.fmap) f))++instance (Functor f, Monad m) => Monad (FreeT f m) where+ return = FreeT . return . Left+ m >>= f = FreeT $ do+ r <- runFreeT m+ case r of+ Left x -> runFreeT $ f x+ Right xc -> return . Right $ fmap (>>= f) xc++instance (Functor f) => MonadTrans (FreeT f) where+ lift = FreeT . liftM Left
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ control-monad-free.cabal view
@@ -0,0 +1,13 @@+Name: control-monad-free+Description:+ A monad transformer for free monads.+Version: 0.1+Stability: experimental+Synopsis: A monad transformer for free monads.+License: PublicDomain+Category: Control+Author: Luke Palmer+Maintainer: lrpalmer@gmail.com+Build-Type: Simple+Build-Depends: base, mtl+Exposed-Modules: Control.Monad.Free