Hello, On 8/3/05, Srinivas Nedunuri <nedunuri@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) -Iavor