
12 Oct
2020
12 Oct
'20
2:20 p.m.
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. Roman