% Monads with Non-Deterministically Updateable State % Sebastian Fischer (sebf@informatik.uni-kiel.de) We define type classes and instances for monads that non-deterministically update state. > {-# LANGUAGE > MultiParamTypeClasses, > FlexibleInstances, > RankNTypes > #-} > > module Control.Monad.Update ( > > MonadUpdate(..), Update(..), > > ) where > > import Control.Monad.State > > class MonadPlus m => MonadUpdate s m > where > update :: (forall m' . MonadPlus m' => s -> m' s) -> m () A monad that supports non-deterministic state updates is an instance of the class `MonadUpdate` that defines an operation to incorporate a monadic update-action into monadic computations. > instance MonadPlus m => MonadUpdate s (StateT s m) > where > update upd = get >>= upd >>= put An instance of `MonadPlus` that threads a state can update that state non-deterministically. > class (MonadPlus m, MonadPlus m') => Update s m m' > where > updateState :: m a -> StateT s m' a We also define an interface for monads that perform associated updates in a state that is threaded through a (possibly, but not necessarily different) monad. We use the state monad transformer `StateT` to thread the constraint store through the monad that returns the results. > instance MonadPlus m => Update s (StateT s m) m > where > updateState = id Again, a state threading monad gives rise to a natural instance, where results are returned in the base monad. State monads are a natural choice for a monad that updates state, but they have a drawback: monadic values are functions that are reexecuted for each shared occurrence of a monadic sub computation.