-- This program demonstrates implementation of monad-independent algorithms -- using Ref and URef classes import Control.Monad.ST import Data.Ref main = do -- This section demonstrates running of monad-independent algrorithm -- `test_Ref` in IO and ST monads test_Ref 3 >>= print runST (test_Ref 4) |> print -- This section demonstrates running of monad-independent algrorithm -- `test_URef` in IO and ST monads test_URef 5 >>= print runST (test_URef 6) |> print -- Using class 'Ref' test_Ref init = do x <- newRef (init::Int) -- `newRef` operation will create -- * IORef in IO monad -- * STRef in ST monad x0 <- readRef x -- `readRef` and `writeRef` operations writeRef x (x0+10) -- works with references of both types readRef x -- Using class 'URef' test_URef init = do x <- newURef (init::Int) -- `newURef` operation will create -- * IOURef in IO monad -- * STURef in ST monad x0 <- readURef x -- `readURef` and `writeURef` operations writeURef x (x0+10) -- works with references of both types readURef x -- Helper operation a |> b = b a