HORIZON HASKELLDocslts/ghc-10.0.x8fef28d2026-11-02Search packagesCtrl K
Theme: |

GHC 10.0.0.20260917 · lts/ghc-10.0.x · 8fef28d · 2026-11-02

Modulefree-5.2Haskell2010

Control.Monad.Trans.Free.Ap

Given an applicative, the free monad transformer.

Contents
  1. The base functor
  2. The free monad transformer
  3. The free monad
  4. Operations
  5. Operations of free monad
  6. Free Monads With Class
Synopsis
  • Packagefree-5.2
  • Exports20
  • LanguageHaskell2010
  • LicenceBSD-3-Clause
  • SourceAp.hs

The base functor

datadata FreeF (f :: Type -> Type) a b

The base functor for a free monad.

Constructors

Instances23Generic1, Bifoldable, Bifunctor, Bitraversable, Eq2, Ord2, …

The free monad transformer

newtypenewtype FreeT (f :: Type -> Type) (m :: Type -> Type) a

The "free monad transformer" for an applicative f

Constructors

Instances29MonadError, MonadReader, MonadState, MonadWriter, MonadFree, MonadTrans, …

The free monad

Operations

valueiterT :: (Applicative f, Monad m) => (f (m a) -> m a) -> FreeT f m a -> m a

Given an applicative homomorphism from f (m a) to m a, tear down a free monad transformer using iteration.

valueiterTM
  1. :: (Applicative f, Monad m, MonadTrans t, Monad (t m))
  2. => f (t m a) -> t m a
  3. -> FreeT f m a
  4. -> t m a

Given an applicative homomorphism from f (t m a) to t m a, tear down a free monad transformer using iteration over a transformer.

valuecutoff
  1. :: (Applicative f, Monad m)
  2. => Integer
  3. -> FreeT f m a
  4. -> FreeT f m (Maybe a)

Cuts off a tree of computations at a given depth. If the depth is 0 or less, no computation nor monadic effects will take place.

Some examples (n ≥ 0):

cutoff 0     _        ≡ return Nothing
cutoff (n+1) . return ≡ return . Just
cutoff (n+1) . lift   ≡ lift . liftM Just
cutoff (n+1) . wrap   ≡ wrap . fmap (cutoff n)

Calling retract . cutoff n is always terminating, provided each of the steps in the iteration is terminating.

Operations of free monad

Free Monads With Class

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, …