New monads/MonadUnique
< New monads
Jump to navigation
Jump to search
Revision as of 17:27, 24 August 2006 by ChrisKuklewicz (talk | contribs)
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
From NewMonads, copied from old wiki.
MonadUnique
This is a simple (trivial) monad transformer for supplying unique integer values to an algorithm.
{-# OPTIONS_GHC -fglasgow-exts #-}
module MonadUnique
( UniqueT,
Unique,
MonadUnique,
fresh,
evalUniqueT,
evalUnique )
where
import Control.Monad
import Control.Monad.State
import Control.Monad.Identity
newtype UniqueT m a = UniqueT (StateT Integer m a)
deriving (Functor, Monad, MonadTrans, MonadIO)
newtype Unique a = Unique (UniqueT Identity a)
deriving (Functor, Monad, MonadUnique)
class Monad m => MonadUnique m where
fresh :: m Integer
instance (Monad m) => MonadUnique (UniqueT m) where
fresh = UniqueT $ do
n <- get
put (succ n)
return n
evalUniqueT (UniqueT s) = evalStateT s 0
evalUnique (Unique s) = runIdentity (evalUniqueT s)