{-# LANGUAGE GADTs, Rank2Types, ScopedTypeVariables #-} {-#
LANGUAGE UndecidableInstances, MultiParamTypeClasses,
FlexibleInstances #-} -- Search for UndecidableInstances to see
why this is needed  module Control.Monad.Operational (     -- *
Synopsis     -- $synopsis     -- * Overview     -- $intro     --
* Monad     Program, singleton, ProgramView, view,     --
$example     -- * Monad transformer     ProgramT,
ProgramViewT(..), viewT,     -- $exampleT     ) where  import
Control.Monad.Identity import Control.Monad.Trans import
Control.Applicative      -- mtl  classes to instantiate.     --
Those commented out cannot be instantiated. For reasons see
below. -- import Control.Monad.Cont.Class -- import
Control.Monad.Error.Class -- import Control.Monad.Reader.Class
import Control.Monad.State.Class -- import
Control.Monad.Writer.Class  To write a monad, use the 'Program'
type.  To write a monad transformer, use the 'ProgramT' type.
For easier interoperability, the 'Program' type is actually a
type synonym and de