Portability | semi-portable (MPTCs,...) |
---|---|
Stability | experimental |
Maintainer | wren@community.haskell.org |
Safe Haskell | Safe-Infered |
This module defines a state monad for functional pointers
represented by integers as keys into an IntMap
. This technique
was independently discovered by Dijkstra et al. This module
extends the approach by using a state monad transformer, which
can be made into a backtracking state monad by setting the
underlying monad to some MonadLogic
(part of the logict
library, described by Kiselyov et al.).
- Atze Dijkstra, Arie Middelkoop, S. Doaitse Swierstra (2008) Efficient Functional Unification and Substitution, Technical Report UU-CS-2008-027, Utrecht University.
- Oleg Kiselyov, Chung-chieh Shan, Daniel P. Friedman, and Amr Sabry (2005) Backtracking, Interleaving, and Terminating Monad Transformers, ICFP.
- newtype IntVar = IntVar Int
- data IntBindingState t
- data IntBindingT t m a
- runIntBindingT :: IntBindingT t m a -> m (a, IntBindingState t)
- evalIntBindingT :: Monad m => IntBindingT t m a -> m a
- execIntBindingT :: Monad m => IntBindingT t m a -> m (IntBindingState t)
Documentation
A "mutable" unification variable implemented by an integer.
This provides an entirely pure alternative to truly mutable
alternatives (like STVar
), which can make backtracking easier.
N.B., because this implementation is pure, we can use it for both ranked and unranked monads.
Eq IntVar | |
Show IntVar | |
Variable IntVar | |
(Unifiable t, Applicative m, Monad m) => RankedBindingMonad t IntVar (IntRBindingT t m) | |
(Unifiable t, Applicative m, Monad m) => BindingMonad t IntVar (IntBindingT t m) | |
(Unifiable t, Applicative m, Monad m) => BindingMonad t IntVar (IntRBindingT t m) |
data IntBindingState t Source
Binding state for IntVar
.
Show (t (UTerm t IntVar)) => Show (IntBindingState t) | |
Monad m => MonadState (IntBindingState t) (IntBindingT t m) |
data IntBindingT t m a Source
A monad for storing IntVar
bindings, implemented as a StateT
.
For a plain state monad, set m = Identity
; for a backtracking
state monad, set m = Logic
.
(Unifiable t, Applicative m, Monad m) => BindingMonad t IntVar (IntBindingT t m) | |
MonadTrans (IntBindingT t) | |
Monad m => MonadState (IntBindingState t) (IntBindingT t m) | |
Monad m => Monad (IntBindingT t m) | |
Functor m => Functor (IntBindingT t m) | |
MonadPlus m => MonadPlus (IntBindingT t m) | |
(Functor m, Monad m) => Applicative (IntBindingT t m) | |
(Functor m, MonadPlus m) => Alternative (IntBindingT t m) | |
MonadLogic m => MonadLogic (IntBindingT t m) |
runIntBindingT :: IntBindingT t m a -> m (a, IntBindingState t)Source
evalIntBindingT :: Monad m => IntBindingT t m a -> m aSource
N.B., you should explicitly apply bindings before calling this function, or else the bindings will be lost
execIntBindingT :: Monad m => IntBindingT t m a -> m (IntBindingState t)Source