Monads provide substitution (fmap) and renormalization (join):
m >>= f = join (fmap f m)A free Monad is one that does no work during the normalization step beyond simply grafting the two monadic values together.
[] is not a free Monad (in this sense) because join [[a]] smashes the lists flat.
On the other hand, consider:
data Tree a = Bin (Tree a) (Tree a) | Tip a
instance Monad Tree where
return = Tip
Tip a >>= f = f a
Bin l r >>= f = Bin (l >>= f) (r >>= f)
This Monad is the free Monad of Pair:
data Pair a = Pair a a
And we could make an instance of MonadFree for it directly:
instance MonadFree Pair Tree where
wrap (Pair l r) = Bin l r
Or we could choose to program with Free Pair instead of Tree
and thereby avoid having to define our own Monad instance.
Moreover, Control.Monad.Free.Church provides a MonadFree
instance that can improve the asymptotic complexity of code that
constructs free monads by effectively reassociating the use of
(>>=). You may also want to take a look at the kan-extensions
package (http://hackage.haskell.org/package/kan-extensions).
See Free for a more formal definition of the free Monad for a Functor.
Methods
wrap :: f (m a) -> m aAdd a layer.
wrap (fmap f x) ≡ wrap (fmap return x) >>= f
Instances18MonadFree, …
Applicative f => MonadFree f (Free f)Defined in free-5.2 · Control.Monad.Free.ApFunctor f => MonadFree f (Free f)Defined in free-5.2 · Control.Monad.FreeFunctor f => MonadFree f (F f)Defined in free-5.2 · Control.Monad.Free.ChurchMonad m => MonadFree Identity (IterT m)Defined in free-5.2 · Control.Monad.Trans.Iter(Functor f, MonadFree f m) => MonadFree f (MaybeT m)Defined in free-5.2 · Control.Monad.Free.ClassMonadFree f (FT f m)Defined in free-5.2 · Control.Monad.Trans.Free.Church(Applicative f, Monad m) => MonadFree f (FreeT f m)Defined in free-5.2 · Control.Monad.Trans.Free.Ap(Functor f, MonadFree f m) => MonadFree f (ExceptT e m)Defined in free-5.2 · Control.Monad.Free.Class(Functor f, MonadFree f m) => MonadFree f (IdentityT m)Defined in free-5.2 · Control.Monad.Free.Class(Functor f, MonadFree f m) => MonadFree f (ReaderT e m)Defined in free-5.2 · Control.Monad.Free.Class(Functor f, MonadFree f m) => MonadFree f (StateT s m)Defined in free-5.2 · Control.Monad.Free.Class(Functor f, MonadFree f m) => MonadFree f (StateT s m)Defined in free-5.2 · Control.Monad.Free.Class(Functor f, MonadFree f m, Monoid w) => MonadFree f (WriterT w m)Defined in free-5.2 · Control.Monad.Free.Class(Functor f, MonadFree f m, Monoid w) => MonadFree f (WriterT w m)Defined in free-5.2 · Control.Monad.Free.Class(Functor f, Monad m) => MonadFree f (FreeT f m)Defined in free-5.2 · Control.Monad.Trans.Free(Functor f, MonadFree f m) => MonadFree f (ContT r m)Defined in free-5.2 · Control.Monad.Free.Class(Functor f, MonadFree f m, Monoid w) => MonadFree f (RWST r w s m)Defined in free-5.2 · Control.Monad.Free.Class(Functor f, MonadFree f m, Monoid w) => MonadFree f (RWST r w s m)Defined in free-5.2 · Control.Monad.Free.Class