I really like this proposal.<div><br></div><div>-Edward<br><br><div class="gmail_quote">On Thu, Oct 4, 2012 at 5:40 AM, Simon Peyton-Jones <span dir="ltr">&lt;<a href="mailto:simonpj@microsoft.com" target="_blank">simonpj@microsoft.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 lang="EN-GB" link="blue" vlink="purple">
<div><div class="im">
<p class="MsoNormal" style="margin-left:36.0pt">There is also the small matter, in this example, of distinguishing which `_&#39; is which. The description works, but you have to think about it. I don&#39;t have an immediate and simple solution to this. Perhaps the
 addition of unique labels (e.g. _$1 _$2). But this is not a major problem. It can even wait until some future development/expansion on TypeHoles.<u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
</div><p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">I have a proposal.  Someone has already suggested on <a href="http://hackage.haskell.org/trac/ghc/ticket/5910" target="_blank">hackage.haskell.org/trac/ghc/ticket/5910</a> that an un-bound variable behaves like a hole.  Thus, if you say<u></u><u></u></span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">          f x = y<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">GHC says “Error: y is not in scope”.  But (idea) with -XTypeHoles<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal" style="text-indent:36.0pt"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">f x = y<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">might generate
<u></u><u></u></span></p>
<p><u></u><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><span>1.<span style="font:7.0pt &quot;Times New Roman&quot;">  
</span></span></span><u></u><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">(renamer)
<b>Warning</b>: y is not in scope<u></u><u></u></span></p>
<p><u></u><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><span>2.<span style="font:7.0pt &quot;Times New Roman&quot;">  
</span></span></span><u></u><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">(type)
<b>Error</b>: Hole “y” has type....<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">So that’s like a named hole, in effect.   
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">If you say<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">   f x = 4<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">GHC warns about the unused binding for x.  But if you say<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">   f _x = 4<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">the unused-binding warning is suppressed.  So (idea) if you say<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">          f x = _y<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">maybe we can suppress warning (1).  And, voila, named holes.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">Moreover if you add –fdefer-type-errors you can keep going and run the program.<u></u><u></u></span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">Any comments?  This is pretty easy to do.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">(I’m unhappy that –XTypeHoles is a language pragma while –fdefer-type-errors is a compiler flag.  Maybe we should have –XDeferTypeErrors?)<u></u><u></u></span></p>

<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d">Simon<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:&quot;Verdana&quot;,&quot;sans-serif&quot;;color:#1f497d"><u></u> <u></u></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt">
<div>
<div style="border:none;border-top:solid #b5c4df 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;">From:</span></b><span lang="EN-US" style="font-size:10.0pt;font-family:&quot;Tahoma&quot;,&quot;sans-serif&quot;"> <a href="mailto:sean.leather@gmail.com" target="_blank">sean.leather@gmail.com</a> [mailto:<a href="mailto:sean.leather@gmail.com" target="_blank">sean.leather@gmail.com</a>]
<b>On Behalf Of </b>Sean Leather<br>
<b>Sent:</b> 03 October 2012 16:45<br>
<b>To:</b> Simon Peyton-Jones<br>
<b>Cc:</b> GHC Users List; Thijs Alkemade<br>
<b>Subject:</b> Comments on current TypeHoles implementation<u></u><u></u></span></p>
</div>
</div><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Hi Simon,<u></u><u></u></p>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Thanks for all your work in getting TypeHoles into HEAD. We really appreciate it.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">I was playing around with HEAD today and wanted to share a few observations.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">(1) One of the ideas we had was that a hole `_&#39; would be like `undefined&#39; but with information about the type and bindings. But in the current version, there doesn&#39;t appear to be that connection. This mainly applies to ambiguous type variables.<u></u><u></u></p>

</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Consider:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">&gt; f = show _<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">The hole has type a0.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">But with<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">&gt; f = show undefined<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">there is a type error because a0 is ambiguous.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">We were thinking that it would be better to report the ambiguous type variable first, rather than the hole. In that case, tou can use -fdefer-type-errors to defer the error. Currently, you don&#39;t have that option. I can see the argument
 either way, however, and I&#39;m not sure which is better.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">(2) There is a strange case where an error is not reported for a missing type class instance, even though there is no (apparent) relation between the missing instance and the hole. (This also relates to the connection to `undefined&#39;, but
 less directly.)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">We have the following declaration:<u></u><u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">&gt; data T = T Int {- no Show instance -}<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">With a hole in the field<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">&gt; g = show (T _)<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal">we get a message that the hole has type Int.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">With<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">&gt; g = show (T undefined)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">we get an error for the missing instance of `Show T&#39;.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">(3) In GHCi, I see that the type of the hole now defaults. This is not necessarily bad, though it&#39;s maybe not as useful as it could be.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">ghci&gt; :t show _<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">reports that the hole has type ().<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">(4) In GHCi, sometimes a hole throws an exception, and sometimes it does not.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">ghci&gt; show _<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">throws an exception with the hole warning message<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">ghci&gt; show (T _)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">and<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">ghci&gt; _ + 42<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">cause GHCi to panic.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">(5) There are some places where unnecessary parentheses are used when pretty-printing the code:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">ghci&gt; :t _ _<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">&lt;interactive&gt;:1:1: Warning:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    Found hole `_&#39; with type t0 -&gt; t<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    Where: `t0&#39; is a free type variable<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">           `t&#39; is a rigid type variable bound by<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">               the inferred type of it :: t at Top level<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    In the expression: _<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    In the expression: _ (_)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">&lt;interactive&gt;:1:3: Warning:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    Found hole `_&#39; with type t0<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    Where: `t0&#39; is a free type variable<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    In the first argument of `_&#39;, namely `_&#39;<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    In the expression: _ (_)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">_ _ :: t<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">The argument `_&#39; does not need to be printed as `(_)&#39;.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">There is also the small matter, in this example, of distinguishing which `_&#39; is which. The description works, but you have to think about it. I don&#39;t have an immediate and simple solution to this. Perhaps the addition of unique labels (e.g.
 _$1 _$2). But this is not a major problem. It can even wait until some future development/expansion on TypeHoles.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Regards,<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Sean<u></u><u></u></p>
</div>
</div></div></div>
</div>
</div>

<br>_______________________________________________<br>
Glasgow-haskell-users mailing list<br>
<a href="mailto:Glasgow-haskell-users@haskell.org">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>
<br></blockquote></div><br></div>