[jhc] Monad.ST

Henning Thielemann jhc at henning-thielemann.de
Sun Nov 15 17:24:18 EST 2009

On Sun, 15 Nov 2009, Isaac Dupree wrote:

> Henning Thielemann wrote:
>> 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.

You are right. I only thought about newSTRef's for which the order is not 
important. Yes, we also have to assert that writes are in order and reads 
remain between adjacent writes. Once I solved a similar problem in the 'lazyio' 
package. I defined IO actions in a way, that triggering one action also 
requires to execute all previous actions. This should also work for ST but it 
is somehow overly strict. E.g.

   do a <- newSTRef 'a'
      b <- newSTRef 'b'
      writeSTRef a 'c'
      writeSTRef b 'd'

can be re-ordered to

   do b <- newSTRef 'b'
      writeSTRef b 'd'
      a <- newSTRef 'a'
      writeSTRef a 'c'

That is, maximum laziness would be achieved, if there would be a state-thread 
for every reference.

More information about the jhc mailing list