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)