Thanks Lorenzo, I&#39;m cc&#39;ing the list with your response also:<div><br></div><div>As you point out, when you do some kind of &quot;let-binding&quot;, using the where clause, or explicit let as in:</div><div><br></div>
<div><div>main :: IO () </div><div>main = do</div><div>       let f1 = (successor :: Int -&gt; State Int Int)</div><div>       let f2 = (successor :: Int -&gt; Maybe Int)</div><div>       b2 &lt;- eq f2 f2</div><div>       b1 &lt;- eq f1 f1</div>
<div>       print (show b1 ++ &quot; &quot; ++ show b2)</div></div><div><br></div><div>The behavior is as expected. I guess the binding triggers some internal optimization or gives more information to the type checker; but I&#39;m still not clear why it is required to be done this way -- having to let-bind every function is kind of awkward.</div>
<div><br></div><div>I know the details of StableNames are probably implementation-dependent, but I&#39;m still wondering about how to detect / restrict this situation.</div><div><br></div><div>Thanks</div><div><br><br><div class="gmail_quote">
2012/6/26 Lorenzo Bolla <span dir="ltr">&lt;<a href="mailto:lbolla@gmail.com" target="_blank">lbolla@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">