Use of evaluate in Control.Concurrent.MVar

Roman Cheplyaka roma at
Mon Oct 12 18:20:12 UTC 2020

Hi David,

On 12/10/2020 21.01, David Feuer wrote:
> Couldn't we just do this?
> modifyMVar m io =
>   mask $ \restore -> do
>     a      <- takeMVar m
>     (a',b) <- restore (io a >>= (pure $!)) `onException` putMVar m a
>     putMVar m a'
>     return b

No — the haddocks for 'evaluate' in Control.Exception explain the difference between the two. In particular,

> The rule of thumb is to use evaluate to force or handle exceptions in lazy values. If, on the other hand, you are forcing a lazy value for efficiency reasons only and do not care about exceptions, you may use return $! x.

If you want to know why, I think you can find some old bugs in the ghc bug tracker that resulted from an incorrect usage of return $! ... where evaluate was warranted.


More information about the Libraries mailing list