Insert a laziness break into strict ST

I have lot of ST actions that shall be bound strictly (they write to a buffer), but somewhere between these actions I like to have a "laziness break". I thought I could do this by temporarily switching to Lazy.ST, but this does not work. It follows a simplified example Prelude> :module Control.Monad.ST.Lazy Prelude Control.Monad.ST.Lazy> runST (Monad.liftM2 (,) (return 'a') (undefined::Monad m => m Char)) ('a',*** Exception: Prelude.undefined Prelude Control.Monad.ST.Lazy> Control.Monad.ST.runST (lazyToStrictST $ Monad.liftM2 (,) (return 'a') (undefined::Monad m => m Char)) *** Exception: Prelude.undefined I hoped to get the first answer also for the second command. It seems that conversion from lazy to strict ST also removes laziness breaks. It seems that I have to stick to unsafeInterleaveIO, but I like to know, why the above method does not work.

On Sun, Dec 6, 2009 at 5:46 PM, Henning Thielemann
I have lot of ST actions that shall be bound strictly (they write to a buffer), but somewhere between these actions I like to have a "laziness break". I thought I could do this by temporarily switching to Lazy.ST, but this does not work. It follows a simplified example
<snip>
I hoped to get the first answer also for the second command. It seems that conversion from lazy to strict ST also removes laziness breaks.
It seems that I have to stick to unsafeInterleaveIO, but I like to know, why the above method does not work.
This isn't the answer you want, but there is an unsafeInterleaveST. Antoine

On Sun, 6 Dec 2009, Antoine Latter wrote:
On Sun, Dec 6, 2009 at 5:46 PM, Henning Thielemann
I hoped to get the first answer also for the second command. It seems that conversion from lazy to strict ST also removes laziness breaks.
It seems that I have to stick to unsafeInterleaveIO, but I like to know, why the above method does not work.
This isn't the answer you want, but there is an unsafeInterleaveST.
This was a typo, I actually meant unsafeInterleaveST. So, I'm still uncertain why the conversion to lazy ST and back does not work. I feel, that I have still not understood what "lazy" ST actually means.
participants (2)
-
Antoine Latter
-
Henning Thielemann