<div dir="ltr">Hi,<div style><br></div><div style>Aha! This page explains what is going on: <a href="http://hackage.haskell.org/trac/ghc/blog/LetGeneralisationInGhc7">http://hackage.haskell.org/trac/ghc/blog/LetGeneralisationInGhc7</a></div>
<div style><br></div><div style>The summary is that the definition of what is &quot;local&quot; is not what one might expect:  only things that depend</div><div style>on variables in scope are considered to be locals, other bindings, that could be lifted out (e.g., like `p` in both examples)</div>
<div style>are not considered local and are generalized.  Of course, with implicit parameters this is not what one might hope for...</div><div style><br></div><div style>A while back there was a discussion about adding a construct for monomorphic bindings to the language (I think the proposed notation was something like &quot;x := 2&quot;).<br>
</div><div style>Perhaps we should revisit it, it seems much simpler than the rather surprising behavior of `MonoLocalBinds`.</div><div style><br></div><div style>-Iavor<br></div><div style><br></div><div style><br></div>
<div style><br></div><div style><br></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Mar 28, 2013 at 4:39 PM, Iavor Diatchki <span dir="ltr">&lt;<a href="mailto:iavor.diatchki@gmail.com" target="_blank">iavor.diatchki@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi,<div>This does not appear to be related to ImplicitParameters, rather `MonoLocalBinds` is not working as expected.</div>
<div><br></div><div>Here is an example without implicit parameters that compiles just fine, but would be rejected if `p` was monomorphic:</div>
<div><br></div><div><div><font face="courier new, monospace">{-# LANGUAGE NoMonomorphismRestriction, MonoLocalBinds #-}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">class C a where</font></div>

<div><font face="courier new, monospace">  f :: a -&gt; ()</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">instance C Bool where f = const ()</font></div><div>

<font face="courier new, monospace">instance C Char where f = const ()</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">g = let p = f</font></div><div><font face="courier new, monospace">    in (p &#39;a&#39;, p True)</font></div>
<span class="HOEnZb"><font color="#888888">
<div><br></div></font></span></div><span class="HOEnZb"><font color="#888888"><div>-Iavor</div><div><br></div><div><br></div></font></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">
On Fri, Mar 22, 2013 at 1:39 AM, Roman Cheplyaka <span dir="ltr">&lt;<a href="mailto:roma@ro-che.info" target="_blank">roma@ro-che.info</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The value of the following expression<br>
<br>
  let ?y = 2  in<br>
  let  p = ?y in<br>
  let ?y = 1  in<br>
  p<br>
<br>
depends on whether the second binding is generalised.<br>
<br>
MonomorphismRestriction makes it not generalise, hence the value is 2.<br>
<br>
What surprises me is that MonoLocalBinds doesn&#39;t have this effect.<br>
<br>
  Prelude&gt; :set -XImplicitParams -XNoMonomorphismRestriction -XMonoLocalBinds<br>
  Prelude&gt; let ?y = 2 in let p = ?y in let ?y = 1 in p<br>
  1<br>
<br>
What&#39;s going on here?<br>
<br>
Roman<br>
<br>
_______________________________________________<br>
Glasgow-haskell-users mailing list<br>
<a href="mailto:Glasgow-haskell-users@haskell.org" target="_blank">Glasgow-haskell-users@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/glasgow-haskell-users" target="_blank">http://www.haskell.org/mailman/listinfo/glasgow-haskell-users</a><br>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>