On Sun, 15 Nov 2009, Isaac Dupree wrote:
Hopefully. I'm afraid that might still be too much interleaving; consider for example the definition of (>>) and (writeSTRef r a >> writeSTRef r b); probably neither write will even happen, because the result () won't be demanded!
If we evaluate runST (newSTRef x >>= \r -> writeSTRef r a >> writeSTRef r b) none of the writeSTRefs would be executed. But this would be correct, wouldn't it?
or (writeSTRef r a >> readSTRef r)
If we evaluate runST (newSTRef x >>= \r -> writeSTRef r a >> readSTRef r) then readSTRef is triggered, because its result is requested and then because of the implementation of unsafeIOToST the previous actions are triggered. However, I see that I must implement strictToLazyST in terms of unsafeIOToST.
(Also don't forget interleaving in instance Applicative Lazy.ST, if the instances ultimately end up being involved)
indeed, I forgot that see new patch