multistate: like mtl's ReaderT/StateT, but more than one contained value/type.
Introduction
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.
Example
simpleExample :: IO () simpleExample = evalMultiStateT $ withMultiState 'H' $ withMultiState "ello, World!" $ do -- the monad here is MultiStateT (Cons [Char] (Cons Char Null)) IO let combinedPrint = do -- no type signature necessary c <- mGet -- type of mGet inferred to be m Char cs <- mGet -- inferred to be m [Char] lift $ putStrLn (c:cs) combinedPrint mSet 'J' -- similarly for the setter combinedPrint
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
Control.Monad.MultiState.ContainsType Foo Null
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.
Flags
Automatic Flags
Name | Description | Default |
---|---|---|
build-test | Build the MultiState-test test program | Disabled |
build-example | Build the MultiState-example example program | Disabled |
Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info
Downloads
- multistate-0.1.3.2.tar.gz [browse] (Cabal source package)
- Package description (as included in the package)
Maintainer's Corner
For package maintainers and hackage trustees
Candidates
Versions [RSS] | 0.1.1, 0.1.2, 0.1.3.1, 0.1.3.2, 0.2.0.0, 0.3.0.0, 0.6.0.0, 0.6.1.0, 0.6.2.0, 0.7.0.0, 0.7.1.1, 0.7.1.2, 0.8.0.0, 0.8.0.1, 0.8.0.2, 0.8.0.3, 0.8.0.4 |
---|---|
Dependencies | base (>=4.6 && <4.8), mtl (>=2.1 && <2.3), multistate, tfp (>=0.8 && <0.9), transformers (>=0.3 && <0.5) [details] |
License | BSD-3-Clause |
Copyright | Jan Bracker, Lennart Spitzner |
Author | Jan Bracker, Lennart Spitzner |
Maintainer | Lennart Spitzner <lsp@informatik.uni-kiel.de> |
Category | Control |
Home page | https://github.com/lspitzner/multistate |
Bug tracker | https://github.com/lspitzner/multistate/issues |
Source repo | head: git clone git@github.com:lspitzner/multistate.git |
Uploaded | by lspitzner at 2014-09-17T17:19:52Z |
Distributions | Arch:0.8.0.4, Debian:0.8.0.3, LTSHaskell:0.8.0.4, NixOS:0.8.0.4, Stackage:0.8.0.4 |
Reverse Dependencies | 6 direct, 2 indirect [details] |
Executables | multistate-example, multistate-test |
Downloads | 20427 total (70 in the last 30 days) |
Rating | (no votes yet) [estimated by Bayesian average] |
Your Rating | |
Status | Docs uploaded by user Build status unknown [no reports yet] |