I would claim that it&#39;s fine to use the type<br>&nbsp; readIVar :: IVar a -&gt; a<br>if you&#39;re willing to give the &quot;right&quot; semantics to<br>&nbsp; newIVar :: IO (IVar a)<br>The semantics is that sometimes when you create an IVar you&#39;ll get one that always returns _|_ when read, sometimes you&#39;ll get a proper one.&nbsp; Now if you happen to read an IVar and it deadlocks your program, well, sorry, you were unlucky and got a bad IVar that time.
<br><br>So it&#39;s possible to explain away the deadlock as something non-deterministic in the IO monad.&nbsp; Doing so comes at a terrible price though, because you can no longer reason about your program.<br><br>&nbsp; -- Lennart
<br><br><div class="gmail_quote">On Dec 9, 2007 7:48 PM, Conal Elliott &lt;<a href="mailto:conal@conal.net">conal@conal.net</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Thanks, Luke.&nbsp; I&#39;d been unconsciously assuming that the IVar would get written to (if ever) by a thread other than the one doing the reading.&nbsp; (Even then, there could be a deadlock.)<br><font color="#888888"><br>&nbsp; - Conal
</font><div><div></div><div class="Wj3C7c"><br><br><div class="gmail_quote">
On Dec 9, 2007 9:37 AM, Luke Palmer &lt;<a href="mailto:lrpalmer@gmail.com" target="_blank">lrpalmer@gmail.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">


<div>On Dec 9, 2007 5:09 PM, Conal Elliott &lt;<a href="mailto:conal@conal.net" target="_blank">conal@conal.net</a>&gt; wrote:<br>&gt; (moving to haskell-cafe)<br>&gt;<br>&gt; &gt; readIVar&#39; :: IVar a -&gt; a<br>&gt; &gt; readIVar&#39; = unsafePerformIO . readIVar
<br>&gt;<br>&gt; &gt; so, we do not need readIVar&#39;. it could be a nice addition to the<br>&gt; libraries, maybe as &quot;unsafeReadIVar&quot; or &quot;unsafeReadMVar&quot;.<br>&gt;<br>&gt; The same argument applies any to pure function, doesn&#39;t it? &nbsp;For instance, a
<br>&gt; non-IO version of succ is unnecessary. &nbsp;My question is why make readIVar a<br>&gt; blocking IO action rather than a blocking pure value, considering that it<br>&gt; always returns the same value?<br><br></div>But I don&#39;t think it does. &nbsp;If we&#39;re single-threaded, before we writeIVar on it,
<br>it &quot;returns&quot; bottom, but afterward it returns whatever what was written. &nbsp;It&#39;s<br>a little fuzzy, but that doesn&#39;t seem referentially transparent.<br><br>Luke<br><div><div></div><div><br>
&gt; &nbsp; - Conal<br>&gt;<br>&gt; On Dec 8, 2007 11:12 AM, Marc A. Ziegert &lt;<a href="mailto:coeus@gmx.de" target="_blank">coeus@gmx.de</a>&gt; wrote:<br>&gt; &gt; many many answers, many guesses...<br>&gt; &gt; let&#39;s compare these semantics:
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; readIVar :: IVar a -&gt; IO a<br>&gt; &gt; readIVar&#39; :: IVar a -&gt; a<br>&gt; &gt; readIVar&#39; = unsafePerformIO . readIVar<br>&gt; &gt;<br>&gt; &gt; so, we do not need readIVar&#39;. it could be a nice addition to the
<br>&gt; libraries, maybe as &quot;unsafeReadIVar&quot; or &quot;unsafeReadMVar&quot;.<br>&gt; &gt; but the other way:<br>&gt; &gt;<br>&gt; &gt; readIVar v = return $ readIVar&#39; v<br>&gt; &gt;<br>&gt; &gt; does not work. with this definition, readIVar itself does not block
<br>&gt; anymore. it&#39;s like hGetContents.<br>&gt; &gt; and...<br>&gt; &gt;<br>&gt; &gt; readIVar v = return $! readIVar&#39; v<br>&gt; &gt;<br>&gt; &gt; evaluates too much:<br>&gt; &gt; &nbsp;it wont work if the stored value evaluates to 1) undefined or 2) _|_.
<br>&gt; &gt; &nbsp;it may even cause a 3) deadlock:<br>&gt; &gt;<br>&gt; &gt; do<br>&gt; &gt; &nbsp;writeIVar v (readIVar&#39; w)<br>&gt; &gt; &nbsp;x&lt;-readIVar v<br>&gt; &gt; &nbsp;writeIVar w &quot;cat&quot;<br>&gt; &gt; &nbsp;return x :: IO String
<br>&gt; &gt;<br>&gt; &gt; readIVar should only return the &#39;reference&#39;(internal pointer) to the read<br>&gt; object without evaluating it. in other words:<br>&gt; &gt; readIVar should wait to receive but not look into the received &quot;box&quot;; it
<br>&gt; may contain a nasty undead werecat of some type. (Schrödinger&#39;s Law.)<br>&gt; &gt;<br>&gt; &gt; - marc<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; Am Freitag, 7. Dezember 2007 schrieb Paul Johnson:
<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; &gt; Conal Elliott wrote:<br>&gt; &gt; &gt; &gt; Oh. &nbsp;Simple enough. &nbsp;Thanks.<br>&gt; &gt; &gt; &gt;<br>&gt; &gt; &gt; &gt; Another question: &nbsp;why the IO in readIVar :: IVar a -&gt; IO a, instead
<br>&gt; &gt; &gt; &gt; of just readIVar :: IVar a -&gt; a? &nbsp;After all, won&#39;t readIVar iv yield<br>&gt; &gt; &gt; &gt; the same result (eventually) every time it&#39;s called?<br>&gt; &gt; &gt; Because it won&#39;t necessarily yield the same result the next time you run
<br>&gt; &gt; &gt; it. &nbsp;This is the same reason the stuff in System.Environment returns<br>&gt; &gt; &gt; values in IO.<br>&gt; &gt; &gt;<br>&gt; &gt; &gt; Paul.<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt; &gt; _______________________________________________
<br>&gt; &gt; &gt; Haskell mailing list<br>&gt; &gt; &gt; <a href="mailto:Haskell@haskell.org" target="_blank">Haskell@haskell.org</a><br>&gt; &gt;<br>&gt; &gt; &gt; <a href="http://www.haskell.org/mailman/listinfo/haskell" target="_blank">


http://www.haskell.org/mailman/listinfo/haskell</a><br>&gt; &gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt; &gt;<br>&gt;<br>&gt;<br></div></div>&gt; _______________________________________________<br>&gt; Haskell-Cafe mailing list
<br>&gt; <a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe
</a>
<br>&gt;<br>&gt;<br></blockquote></div><br>
</div></div><br>_______________________________________________<br>Haskell-Cafe mailing list<br><a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br><a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">
http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br><br></blockquote></div><br>