[Haskell-cafe] ST.Lazy vs ST.Strict

Daniel Fischer daniel.is.fischer at web.de
Tue May 5 17:22:13 EDT 2009

Am Dienstag 05 Mai 2009 21:42:00 schrieb Tobias Olausson:
> This simple implementation of CPU does not behave as expected in the
> latest version of  ghc using ST.Lazy since it updates the `pc` in the
> wrong order.
> When we use ghc-6.8 the code works as expected both with lazy and strict
> ST. How is that? How do we fix this so we can use ghc-6.10.

Fix 1: compile with optimisations.
The sample code worked here with that.

Fix 2: change fetch:

> fetch :: CPU s OPCode
> fetch = getVar pc >>= \v -> alterVar pc (+1) >> readMem v

The lazy ST doesn't actually read the STRef before readMem v is called, so it reads the 
altered STRef and consequently the wrong memory address. Make sure that v is determined 
before the STRef is altered, e.g. by

fetch = getVar pc >>= \v -> v `seq` (alterVar pc (+1) >> readMem v)


fetch = do
    v <- getVar pc
    w <- readMem v
    alterVar pc succ
    return w

More information about the Haskell-Cafe mailing list