<p dir="ltr">I don&#39;t know what the denotation for this would be, but I can&#39;t think of any reasonable ones for which I can write (==) to respect the denotation. For example, is &quot;set A, then set B&quot; equal to &quot;set B, then set A&quot;? Maybe you could argue that they aren&#39;t operationally equivalent, but can you guarantee that such reordering are *never* operationally equivalent? How about an action that take an input from stdin and then outputs the result of some computation based on it? How do you compare two such actions? I disagree with Jerzy on the purity of IO, but I don&#39;t think this line of argument is bound to be very fruitful.</p>

<p dir="ltr">Jerzy, taking a similar example to that last one, would you say functions are impure just because I can&#39;t write a general (==) for them? I don&#39;t see what bountiful numbers of operations has to do with purity. </p>

<p dir="ltr">- Jake</p>
<div class="gmail_quote">On Aug 8, 2013 7:21 AM, &quot;Tom Ellis&quot; &lt;<a href="mailto:tom-lists-haskell-cafe-2013@jaguarpaw.co.uk">tom-lists-haskell-cafe-2013@jaguarpaw.co.uk</a>&gt; wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On Thu, Aug 08, 2013 at 11:38:08AM +0200, Jerzy Karczmarczuk wrote:<br>
&gt; Tom Ellis:<br>
&gt; &gt;If I were writing a Haskell compiler I could certainly define &#39;IO&#39; to be a<br>
&gt; &gt;datatype that would allow me to compare &#39;putStr &quot;c&quot;&#39; to itself.  The<br>
&gt; &gt;comparison could not be of operational equivalence, but it would still be<br>
&gt; &gt;possible to compare values in IO in a reasonable sense.<br>
&gt;<br>
&gt; Would you add to all this:<br>
&gt; getLine == getLine<br>
&gt; etc.?<br>
&gt;<br>
&gt; Good luck!<br>
&gt;<br>
&gt; I suspect that you would have to establish also the equality<br>
&gt; relation between functions and between infinite streams.<br>
&gt; And you would end as Giordano Bruno and Jeanne d&#39;Arc. But for<br>
&gt; different reasons.<br>
<br>
Not at all.  One could simply implement IO as a free monad, to take one<br>
example.<br>
<br>
Tom<br>
<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>
</blockquote></div>