It seems like a neat feature, and it could just be my inexperience with Haskell but it doesn&#39;t seem &quot;killer&quot;.  For example, why would you want to expand readLine like that if you already have it defined?  It seems to defeat much of the benefit of functional languages in the first place, which is that it&#39;s so easy to reuse code by composing functions into new functions.  I can see the case where you&#39;re passing all constants to a function, because then supposedly inlining it might be more efficient, but I would think the compiler would optimize most of the cases for you anyway.  <br>
<br>One feature that I -do- think would be killer though, is the ability for the editor to do a mouse-over tooltip of a) function definitions, and b) arbitrary expressions.  So like in your example above, hovering the mouse over `minus` in the expression p1 `minus` p2 would pop up a two line tooltip that looked like this<br>
<br>minus :: (Num a, Num b, Num c) =&gt; (a,b,c) -&gt; (a,b,c) -&gt; (a,b,c)<br>minus :: first -&gt; second -&gt; (a,b,c)<br><br>Something along those lines.  It&#39;s nice to be able to see names of function arguments without having to navigate away from the line you&#39;re editing.  This isn&#39;t the killer yet though since it&#39;s actually pretty standard for most sufficiently advanced programming language IDEs.  The killer is that the mouse-over event would also look one line above the function definition for a comment.  It would then scan backward until it finds no more comments.  It would then display that text above the function definition.  It&#39;s great having a type signature, but comments would just be icing on the cake.<br>
<br>For arbitrary expressions, suppose you had the following function:<br><br>replaceItem :: [a] -&gt; (a -&gt; Bool) -&gt; a -&gt; [a]<br>let replaceItem xs pred = (: filter (not.pred) xs)<br><br>You then highlight the text &quot;filter (not.pred)&quot; and hover over the highlighted text.  The mouse then pops up a tooltip that says &quot;[a] -&gt; [a]&quot;.  That would be killer IMO<br>
<br><br><br><div class="gmail_quote">On Thu, Apr 2, 2009 at 7:01 PM, Duane Johnson <span dir="ltr">&lt;<a href="mailto:duane.johnson@gmail.com">duane.johnson@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
So I was thinking about a &quot;killer feature&quot; for a text editor.  Wouldn&#39;t it be neat if you could expand function calls into their definitions, in-place?<br>
<br>
For example, suppose we have &quot;minus&quot; defined like so, somewhere in another file:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
minus (a, b, c) (x, y, z) = (a - x, b - y, c - z)<br>
</blockquote>
<br>
Later, we make use of the function in our current context:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
let p1 = (1, 2, 3)<br>
     p2 = (4, 5, 6)<br>
in p1 `minus` p2<br>
</blockquote>
<br>
By telling the editor to &quot;expand&quot; the minus, we get a temporary replacing of the above with:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
(1 - 4, 2 - 5, 3 - 6)<br>
</blockquote>
<br>
Another example:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
  parse s = map readLine ls<br>
</blockquote>
<br>
And supposing that readLine is defined somewhere else, moving the cursor to readLine in the line above and &quot;expanding&quot; becomes:<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
  parse s = map (\line -&gt; words $ dropWhile (== &#39; &#39;) line)<br>
</blockquote>
<br>
This is all pretty standard for the kinds of things we do in Haskell to work it out by hand, but is there any reason the parser couldn&#39;t do this?  I think it would be even harder to do automatically in any other language.  Maybe it&#39;s already been attempted or done?<br>

<br>
Curious,<br>
<br>
Duane Johnson<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br>