"Glynn Clements" <glynn@gclements.plus.com> wrote in message news:17136.35401.310280.912763@cerise.gclements.plus.com...
Srinivas Nedunuri wrote:
Hello, I have some code that manipulates STRefs within the ST monad. All good and fine, until I come across some computation that uses lets say IO and everything skids to a halt. At this point I have 3 choices:
1. Define a ST State Transformer monad and do all my previous ST computations in that 2. convert all subsequent ST computations into IO computations using stToIO 3. stop using the ST monad and do everything in the IO monad
I was wondering what advice folks had. In particular, what are the disadvantages to doing everything in the IO monad - ie why even bother with the ST monad?
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?
Also, there is no ioToST (only unsafeIOToST), so if you use the IO monad, the code can only be used within the IO monad. The IO monad is like a "trap"; once your inside, you can't get out. True but I'm effectively trappend now anyway. I have a bunch of ST code, and then somewhere in there I had the misfortune of needing to insert a file copy and bam I'm now stuck with the dang IO monad which goes and "infects" the entire program.
-- Glynn Clements <glynn@gclements.plus.com>