[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