On Thu, Nov 11, 2010 at 10:28 PM, Dan Doel <span dir="ltr">&lt;<a href="mailto:dan.doel@gmail.com">dan.doel@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="im">On Thursday 11 November 2010 12:34:21 pm John Lato wrote:<br>
&gt; I think the only way this would work would be if you consider functions to<br>
&gt; be equal only to themselves, i.e. &quot;x+x&quot; and &quot;2*x&quot; are not equal.  That&#39;s<br>
&gt; not a trade-off I would be willing to make.<br>
<br>
</div>In general, it doesn&#39;t even have to be based on a mathematical identity. As<br>
has been stated, this would in general simply break referential transparency.<br>
Are these two functions equal:<br>
<br>
  f x = k (h x) (h x)<br>
  g x = let y = h x in k y y<br>
<br>
Presumably, no, if serialize exists (and they may have different performance<br>
characteristics).<br>
<br>
You cannot factor out or inline subexpressions or without the difference being<br>
observable (presumably) by serialize.</blockquote><div><br></div><div>Yes, exactly.  Thanks for this example, because it illustrates better how far-reaching this would be.  And it&#39;s true not just when these transformations are manually performed, but also when they&#39;re performed by the compiler.  Haskell without referential transparency simply wouldn&#39;t be Haskell any more.  And any code that used a pure serialize may or may not work, depending on compiler magic.</div>
<div><br></div><div>Of course, this is presuming that serialize is pure.  I suppose it might be possible for a serialize with type &quot;a -&gt; IO ByteString&quot; to just dump stack+heap+whatever.  You could use TH+Hint, LLVM, or likewise to get a similar effect now.</div>
<div><br></div><div>John</div></div>