ref: 8a6b73c2f818be805cf66e8ef165a383dfd8e173
dir: /tests/ST.hs/
module ST(main) where
import Prelude
import Control.Monad.ST
import Data.STRef
import Debug.Trace
facST :: forall s . Int -> ST s Int
facST n = do
ri <- newSTRef 1
rr <- newSTRef 1
let loop = do
i <- readSTRef ri
if i > n then
return ()
else do
writeSTRef ri (i + 1)
modifySTRef rr (i *)
loop
loop
readSTRef rr
fac :: Int -> Int
fac n = runST (facST n)
main :: IO ()
main = do
print (fac 10)