Thanks Lorenzo, I'm cc'ing the list with your response also:<div><br></div><div>As you point out, when you do some kind of "let-binding", 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 -> State Int Int)</div><div> let f2 = (successor :: Int -> Maybe Int)</div><div> b2 <- eq f2 f2</div><div> b1 <- eq f1 f1</div>
<div> print (show b1 ++ " " ++ 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'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'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"><<a href="mailto:lbolla@gmail.com" target="_blank">lbolla@gmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">