[Haskell-cafe] Stupid newbie question of the day: why is newMVar in the IO monad?
Brian Hurt
bhurt at spnz.org
Thu Apr 17 14:34:46 UTC 2014
Thanks. This helps. I was right to mistrust the unsafePerformIO
"solution". :-) What Haskell was telling me is that I need to think about
the scope of the identifiers I'm allocating, and what guarantees I'm making.
On Thu, Apr 17, 2014 at 10:26 AM, Danny Gratzer <danny.gratzer at gmail.com>wrote:
> New `MVar` has to return a different memory location every time and this
> is noticeable, it's not referentially transparent.
>
> Consider what would happen if we made the transformation
>
> let a = newMVar 0
> let b = newMVar 0
> putMVar a 1
> readMVar b
>
> to
>
> let a = newMVar 0
> b = a
> ...
>
> If newMVar was referentially transparent, we can automatically share any
> of it's calls with same arguments since they're supposed to return the same
> thing everytime. Since it's not referentially transparent, back into the IO
> monad it goes.
>
> Also if you do that toplevel counter trick, you want NoInline otherwise
> GHC might just inline it at each occurrence and you'll end up with separate
> counters.
>
> Cheers,
> Danny Gratzer
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20140417/78275454/attachment.html>
More information about the Haskell-Cafe
mailing list