A reason I end up with far more anonymous functions in my Erlang than Haskell code (and end up with longer functions in Erlang) is the lack of 'let' and 'where'.<div><br></div><div>In Erlang I'd do:</div>
<div><br></div><div>-spec area_of_circles(record(circle)) -> [float()]</div><div>area_of_circles(Circles) -></div><div>  lists:map(fun(C) -> </div><div>                              math:pi() * math:pow(C#circle.radius, 2) </div>
<div>                end, Circles).</div><div><br></div><div>While in Haskell:</div><div><br></div><div><div>area_of_circles :: [Shape] -> [Float]</div><div>area_of_circles circles =</div><div>  L.map (area_of_circle) circles</div>
<div>  where</div><div>    area_of_circle (Circle radius) = pi * radius^2</div></div><div><br></div><div>Not a great example, but I don't have time to come up with a better one... But maybe portrays what I mean about Erlang making me less likely to name anonymous functions and less likely to break things into smaller functions.</div>
<div><br></div><div>Tristan<br><br><div class="gmail_quote">On Thu, Jul 21, 2011 at 7:34 AM, Jesper Louis Andersen <span dir="ltr"><<a href="mailto:jesper.louis.andersen@gmail.com">jesper.louis.andersen@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im">On Thu, Jul 21, 2011 at 09:39, Tony Arcieri <<a href="mailto:tony.arcieri@gmail.com">tony.arcieri@gmail.com</a>> wrote:<br>

<br>
</div><div class="im">> Ruby has this really nifty feature called blocks which, to put not too<br>
> fine a point on it, provides some awesome syntactic sugar for passing<br>
> an anonymous function as an argument to another function. In Ruby,<br>
> blocks look like this:<br>
><br>
>     [1,2,3,4,5].map do |n|<br>
>         n * 2<br>
>     end<br>
<br>
</div>Most of the trouble stems from<br>
<br>
a) No currying in Erlang<br>
b) A long anonymous function notation<br>
c) No sectioning<br>
<br>
In Haskell, your example is<br>
<br>
map (*2) [1..5]<br>
<br>
and if written without sectioning:<br>
<br>
map (\x -> x * 2) [1..5]<br>
<br>
and in SML which doesn't have a list constructor convenience notation:<br>
<br>
List.map (fn x => x * 2) [1,2,3,4,5]<br>
<br>
.<br>
<br>
Ruby blocks is a weak implementation of anonymous functions in every<br>
way. The problems from using lots of anonymous functions in Erlang<br>
programs is mainly because the notational overhead of using them is<br>
too big. But then again, I don't find<br>
<br>
lists:map(fun(X) -> X * 2 end, [1,2,3,4,5]),<br>
<br>
much harder to read. Yes, there is more clutter in there due to the<br>
function object. But it has a distinct advantage over the block in<br>
ruby which is that it is not statement-syntax but an expression. I can<br>
write<br>
<br>
foo(F) -><br>
  lists:map(F, [1,2,3,4,5]).<br>
<br>
and get away with it. In Ruby you have to do something more here to<br>
turn the do-block, which is a statement, into some kind of value you<br>
can then pass around. When I looked at Ruby in 2002 they had some<br>
"proc" objects to do this with. I am sure it is better today. My main<br>
gripe with the kind of notation you propose is that it doesn't<br>
*compose* in the sense of a mathematical algebra.  It is also why I<br>
like currying, and why I absolutely *love* Agda 2 for its infix<br>
operator definitions. In Agda, you can do:<br>
<br>
data List (A : Set) : Set where<br>
  [] : List A<br>
  _∷_ : A -> List A -> List A<br>
<br>
which defines that we have a list and that the notation of the cons<br>
is: x ∷ l, where x has type A and l has type List A. You can even do<br>
more advanced stuff like if_then_else to build if-then-else statements<br>
yourself. These tools allow you to construct algebraic solutions to<br>
nearly any problem statement syntax will help with.<br>
<br>
TL;DR I don't think we need a new kind of syntax for certain kinds of<br>
lambda sections (see the 'cut' proposal a couple of days ago from<br>
SRFI-26 in Scheme-land). But I do agree the notation is heavier than<br>
it could be. A more convenient notation would encourage people to use<br>
anonymous functions more.<br>
<br>
--<br>
<font color="#888888">J.<br>
</font><div><div></div><div class="h5">_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br></div>