[Haskell] Re: ST/STRef vs. IO/IORef

Iavor Diatchki iavor.diatchki at gmail.com
Wed Aug 3 17:49:48 EDT 2005


On 8/3/05, Srinivas Nedunuri <nedunuri at cs.utexas.edu> wrote:
> > The most obvious disadvantage is that the IO monad has no equivalent
> > of runST.
> OK, I'm missing something here. What is the big deal about runST? Can I not
> get the IO equivalent by simply running the program at the top level
> (assuming I don't have multiple threads going). Do you have a practical
> example of needing runST in several places in your program?

Here is an example (not that I am suggesting that this is how we
should write the function 'fib').  Notice the type of 'fib' --- there
are no monads, even though the implementation internally uses state.

import Control.Monad.ST
import Data.STRef

fib  :: Int -> Int
fib n = runST (do x <- newSTRef 1
                  y <- newSTRef 1
                  let loop n | n < 1 = return ()
                      loop n  = do x' <- readSTRef x
                                   y' <- readSTRef y
                                   writeSTRef x y'
                                   writeSTRef y (x' + y')
                                   loop (n-1)
                  loop n
                  readSTRef x)


More information about the Haskell mailing list