HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Modulefree-5.2Haskell2010

Control.Monad.Free.Class

Monads for free.

  • 1 class
  • 2 values
  • Packagefree-5.2
  • Exports3
  • LanguageHaskell2010
  • LicenceBSD-3-Clause
  • SourceClass.hs
classclass Monad m => MonadFree (f :: Type -> Type) (m :: Type -> Type) | m -> f where
#

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 a

    Add a layer.

    wrap (fmap f x) ≡ wrap (fmap return x) >>= f
    
Instances18MonadFree, …
valueliftF :: (Functor f, MonadFree f m) => f a -> m a
#

A version of lift that can be used with just a Functor for f.

valuewrapT
  1. :: (Functor f, MonadFree f m, MonadTrans t, Monad (t m))
  2. => f (t m a)
  3. -> t m a
#

A version of wrap for monad transformers over a free monad.

Note: that this is the default implementation for wrap for MonadFree f (t m).