I am trying to learn how to use the ST Monad
. I wonder if it is possible to print values as actions are taken. For example with a Fibonacci
function in the ST Monad
:
fibST :: Integer -> Integer
fibST n
| n < 2 = n
| otherwise =
runST $ do
a <- newSTRef 0
b <- newSTRef 1
go n a b
where
go 0 a _ = readSTRef a
go n a b = do
a' <- readSTRef a
b' <- readSTRef b
writeSTRef a b'
writeSTRef b (a' + b')
-- print "SOME INFORMATION HERE" <---
go (n - 1) a b
What would I have to do in this case?
@Vikstapolis suggested to use IORef
instead
fibIO :: Integer -> IO Integer
fibIO n
| n < 2 = pure n
| otherwise =
do
a <- newIORef 0
b <- newIORef 1
go n a b
where
go 0 a _ = readIORef a
go n a b = do
a' <- readIORef a
b' <- readIORef b
writeIORef a b'
writeIORef b (a' + b')
print a' -- intermediate values
go (n - 1) a b