multistate: like mtl's ReaderT/StateT, but more than one contained value/type.

[ bsd3, control, library ] [ Propose Tags ]


When using multiple ReaderT's or StateT's in the same monad stack, it becomes necessary to lift the operations in order to affect a specific transformer. Using heterogenous lists (type level functions), a GADT and a corresponding type class, this package provides transformers that remove that necessity: MultiReaderT/MultiStateT can contain a heterogenous list of values.

The type inferred for the getter/setter determines which value is read/written.


simpleExample :: IO ()
simpleExample = evalMultiStateT
              $ withMultiState 'H'
              $ withMultiState "ello, World!"
              $ do
  -- the monad here is MultiStateT '[String, Char] IO
  let combinedPrint = do       -- no type signature necessary
        c  <- mGet             -- type of mGet inferred to be m Char
        cs <- mGet             --              inferred to be m String
        lift $ putStrLn (c:cs)
  mSet 'J'                     -- similarly for the setter

The output is:

Hello, World!
Jello, World!

( you can find both this and a more complex example in an executable in the package. )

Error Messages

If you try to execute an action that requires a specific type in the state, but the current state does not contain that type, the error message is something like

No instance for (Control.Monad.MultiState.ContainsType Foo '[])

where Foo is the missing type.

Known Deficits

This package currently lacks a complete set of "lifting instances", i.e. instance definitions for classes such as mtl's MonadWriter "over" the newly introduced monad transformers, as in

instance (MonadWriter w m) => MonadWriter w (MultiStateT c m) where ..

These "lifting instances" would be necessary to achieve full compatability with existing transformers. Ping me if you find anything specific missing.


Null        -> '[]
Cons a Null -> '[a]
Cons a b    -> a ': b
TNull       -> HNil
TCons a b   -> a :+: b
Versions [faq] 0.1.1, 0.1.2,,,,,,,,,,,,,
Dependencies base (>=4.6 && <4.8), mtl (>=2.1 && <2.3), multistate, transformers (>=0.3 && <0.5) [details]
License BSD-3-Clause
Copyright Jan Bracker, Lennart Spitzner
Author Jan Bracker, Lennart Spitzner
Maintainer Lennart Spitzner <>
Category Control
Home page
Bug tracker
Source repo head: git clone
Uploaded by lspitzner at Wed Jan 21 23:15:40 UTC 2015
Distributions NixOS:, Stackage:
Executables multistate-example, multistate-test
Downloads 9119 total (560 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs uploaded by user
Build status unknown [no reports yet]





Build the MultiState-test test program


Build the MultiState-example example program


Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info


Maintainer's Corner

For package maintainers and hackage trustees