[jhc] Monad.ST

Isaac Dupree ml at isaac.cedarswampstudios.org
Sun Nov 15 16:53:07 EST 2009

Henning Thielemann wrote:
> On Sun, 15 Nov 2009, Isaac Dupree wrote:
>> well, it would be nice for such a "portable" implementation to exist...
> Voila
>   http://darcs.haskell.org/packages/statethread/
> It compiles, but I have not tested any program that uses it. Even with 
> simplest examples using storablevector it depends largely on fortune 
> whether they run or crash. So no chance to make reliable statements 
> about something more complex.

hmm, I looked at the code. I don't quite understand lazy ST, but I don't 
think that version you made is correct.  The writes (and reads) really 
may not be re-ordered based on which data is demanded when.  I think the 
distinctive thing about lazy ST is that the whole computation doesn't 
have to be executed before returning a result (so you can return an 
infinite list/computation, like, do{ a <- something; as <- recur; return 
(a:as) } ).  But I can't figure out how to implement the correct 
behavior... (or if I'm just confused)...

>> However, unsafePerformIO is often slower than an ST implementation has 
>> the potential to be (e.g. in GHC unsafePerformIO contains lots of 
>> safe-guards, each of which has been added after painful experience but 
>> which are not needed for ST itself).
> unsafePerformIO is needed only once per ST block, namely for runST. That 
> should not be too often.

ah, right.  (unsafeInterleaveIO isn't perfect either, but, first to 
consider correctness, as above)

More information about the jhc mailing list