On Wed, Nov 16, 2011 at 2:23 PM, Jason Dusek <[email protected]> wrote:
> > Just double checked. modifySTRef is too lazy:
> > -- |Mutate the contents of an 'STRef'
> > modifySTRef :: STRef s a -> (a -> a) -> ST s ()
> > modifySTRef ref f = writeSTRef ref . f =<< readSTRef ref
> > We need Data.STRef.Strict
>
> Tried a modifySTRef' defined this way:
>
> modifySTRef' ref f = do
> val <- (f $!!) <$> readSTRef ref
> writeSTRef ref (val `seq` val)
>
> ...but there was no change in memory usage.
Why not just
modifySTRef :: STRef s a -> (a -> a) -> ST s ()
modifySTRef ref f = do
x <- readSTRef ref
writeSTRef ref $! f x
(Note that I didn't check if modifySTRef was actually a problem in this
case).
-- Johan
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe