Higher Order Function Question

Richard Carlsson richardc@REDACTED
Fri May 24 11:22:53 CEST 2002


(Sorry for the previous one - I hit "send" by mistake.)

A list comprehension is a bit easier to read, and executes faster
(becomes a local recursive function):

	[X || X <- SomeList, not attr:isPk(X)]

> 	lists:filter(fun (Attr) -> not attr:isPk(Attr) end, SomeList)

Yes, this is the way to do it if you prefer to use lists:filter.
And there is not much of a point in defining a "complement" function
unless you really need it often in your program.

> > 4> apply({attr, isPk}, [A1]).

Please forget that this form of function call ever existed. Use

	F(...)

where F = fun ..., or

	M:F(...)

where M and F are atoms.

Only use apply(M, F, [...]) when you really, really cannot find an
alternative.

	/Richard



On Fri, 24 May 2002, Raimo Niskanen wrote:

> I cannot come up with anything better than:
> 
> 	lists:filter(fun (Attr) -> not attr:isPk(Attr) end, SomeList)
> 
> or
> 
> 	complement(Fun) -> fun (Attr) -> not Fun(Attr) end.
> 
> 	lists:filter(complement({attr, isPk}), SomeList)
> 	% or
> 	lists:filter(complement(fun isPk/1), SomeList) % within module 'attr'
> 	% or
> 	lists:filter(complement(fun(Attr) -> attr:isPk(Attr) end, SomeList) %
> Very pointless with the complement() function
> 
> / Raimo Niskanen, Erlang/OTP, Ericsson AB
> 
> 
> 
> 
> Alex Peake wrote:
> > 
> > Can someone help me with this (no doubt simple) problem.
> > 
> > I try:
> > 
> > 1> attr:isPk(Attr).
> > false
> > 
> > 2> not attr:isPk(Attr).
> > true
> > 
> > 3> not(attr:isPk(Attr)).
> > true
> > 
> > but cannot find a permutation/combination of:
> > 
> > 4> apply({attr, isPk}, [A1]).
> > false
> > 
> > that can include "not" and work.
> > 
> > Actually, I am trying to lists:filter( ...not isPk... SomeList).
> > 
> > The simple is to define notIsPk(Attr), or perhaps lists:filter( fun(Attr) ->
> > .. end  but they are not an abstraction of "complement".
> > 
> > Perhaps I should define a function complement(Fn) that returns a function
> > that is the complement of the function passed?
> > 
> > Perhaps there is already an Erlang way to do this (I hope).
> > 
> > Alex
> 

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