Difference between revisions of "New monads/MonadUnique"
Jump to navigation
Jump to search
BrettGiles (talk | contribs) m (Heading standards / copyright issues) |
CaleGibbard (talk | contribs) |
||
Line 1: | Line 1: | ||
[[Category:Code]] |
[[Category:Code]] |
||
− | {{Template:Non-standard copyright}} |
||
From New monads, copied from [http://haskell.org/hawiki/MonadUnique old wiki]. |
From New monads, copied from [http://haskell.org/hawiki/MonadUnique old wiki]. |
||
This is a simple (trivial) monad transformer for supplying unique integer values to an algorithm. |
This is a simple (trivial) monad transformer for supplying unique integer values to an algorithm. |
||
− | [http://haskell.org/hawiki/CaleGibbard_2fBSDLicense "CaleGibbard/BSDLicense"] |
||
==MonadUnique== |
==MonadUnique== |
||
<haskell> |
<haskell> |
||
Line 45: | Line 43: | ||
There is also a simple way to get the same functionality in the ST Monad. Here's a quick module to construct infinite supplies of unique values in the ST monad: |
There is also a simple way to get the same functionality in the ST Monad. Here's a quick module to construct infinite supplies of unique values in the ST monad: |
||
− | |||
− | [http://haskell.org/hawiki/CaleGibbard_2fBSDLicense "CaleGibbard/BSDLicense"] |
||
<haskell> |
<haskell> |
Latest revision as of 07:33, 10 December 2006
From New monads, copied from old wiki.
This is a simple (trivial) monad transformer for supplying unique integer values to an algorithm.
MonadUnique
{-# 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)
STSupply
There is also a simple way to get the same functionality in the ST Monad. Here's a quick module to construct infinite supplies of unique values in the ST monad:
module STSupply (Unique, createSupply) where
import Control.Monad.ST
import Data.STRef
newtype Unique = Unique Integer deriving (Eq, Ord)
createSupply :: ST s (ST s Unique)
createSupply = do
v <- newSTRef $ Unique 0
return $ do
Unique x <- readSTRef v
writeSTRef v $ Unique (x+1)
return $ Unique x
A test example:
import Control.Monad.ST
import STSupply
main = print test1
test1 = runST supplyTest
where supplyTest = do
fresh <- createSupply
x <- fresh
y <- fresh
return (x == x, x == y, x < y)