<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Perhaps it wouldn't be as all-wonderful as I think, but as a "new" Haskell user, I am constantly switching back and forth between various definitions of things trying to compare documentation and files...<div><br></div><div>The purpose of "expansion" as I was explaining it is not to *permanently replace* what is in the text, but rather to *temporarily replace* it. &nbsp;I imagine it kind of like a "zoom in" for code. &nbsp;You could "zoom in" on one function, and seeing a new function that you don't recognize, "zoom in" again, and so on. &nbsp;Once done, you would hit "ESC" to make it all return as it was.</div><div><br><div>BTW, I do like your suggestion of tooltip types. &nbsp;That would be very handy!</div><div><br></div><div>Duane Johnson</div><div><br></div><div><div><div>On Apr 2, 2009, at 6:24 PM, Zachary Turner wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">It seems like a neat feature, and it could just be my inexperience with Haskell but it doesn't seem "killer".&nbsp; For example, why would you want to expand readLine like that if you already have it defined?&nbsp; It seems to defeat much of the benefit of functional languages in the first place, which is that it's so easy to reuse code by composing functions into new functions.&nbsp; I can see the case where you'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.&nbsp; <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.&nbsp; 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.&nbsp; It's nice to be able to see names of function arguments without having to navigate away from the line you're editing.&nbsp; This isn't the killer yet though since it's actually pretty standard for most sufficiently advanced programming language IDEs.&nbsp; The killer is that the mouse-over event would also look one line above the function definition for a comment.&nbsp; It would then scan backward until it finds no more comments.&nbsp; It would then display that text above the function definition.&nbsp; It'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 "filter (not.pred)" and hover over the highlighted text.&nbsp; The mouse then pops up a tooltip that says "[a] -&gt; [a]".&nbsp; 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 "killer feature" for a text editor. &nbsp;Wouldn't it be neat if you could expand function calls into their definitions, in-place?<br> <br> For example, suppose we have "minus" 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> &nbsp; &nbsp; p2 = (4, 5, 6)<br> in p1 `minus` p2<br> </blockquote> <br> By telling the editor to "expand" 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;"> &nbsp;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 "expanding" 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;"> &nbsp;parse s = map (\line -&gt; words $ dropWhile (== ' ') 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't do this? &nbsp;I think it would be even harder to do automatically in any other language. &nbsp;Maybe it'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></blockquote></div><br></div></div></body></html>