Higher Order Function Question
Richard Carlsson
richardc@REDACTED
Mon May 27 16:05:39 CEST 2002
On Sat, 25 May 2002, Alex Peake wrote:
> I was struggling to use "filter" with the "complement of" a predicate (in my
> case not attr:isPk).
>
> In explaining the problem, it came out that in my code I wrote things like:
>
> lists:map({attr,varName}, rel:attrList(rel:findNamed(ng,"Member"))).
>
> I was informed that this is "not elegant" and "inefficient" because it "is
> the old classic version of how to call a fun".
In the bad old days, there were no lambda closures at all in Erlang, and
this 2-tuple thing was added as a kind of simple poor man's lambda. But
things have improved since then, and the ability of 'apply' to interpret
2-tuples as function values is really something that is best forgotten.
Really.
> lists:map(fun(Arg) -> attr:varName(Arg) end,
> rel:attrList(rel:findNamed(ng,"Member"))).
>
> is more efficient, but as programmer reading this, I find the
> fun...end part makes the intent less clear.
I'd claim the opposite, in fact. First, the "fun (...) -> ... end"
clearly shows what the operation to be passed to "map" is. Second, the
call "attr:varName(...)" makes it apparent that we are calling a certain
function (with a certain arity) in a certain module, and what the
arguments to that function will be. Of course it requires a few more
characters to type, but as a programming pattern it is both cleaner and
more powerful.
If the function was a local one (in the same module), you could write
lists:map(fun varName/1, MyList)
but there is no notation "fun M:F/A" for functions in other modules,
because of the way inter-module ("remote") calls work with dynamic code
replacement in Erlang.
List comprehensions are of course very elegant, but only work for
operations that are combinations of map/filter.
Richard Carlsson (richardc@REDACTED) (This space intentionally left blank.)
E-mail: Richard.Carlsson@REDACTED WWW: http://www.csd.uu.se/~richardc/
"Having users is like optimization: the wise course is to delay it."
-- Paul Graham
More information about the erlang-questions
mailing list