试图找出这个简单的Erlang过滤器问题。它应该采用谓词和列表,并返回第一个列表的修改版本,其中所有元素都为谓词返回true。
-module(filter).
-export([filterlist/2]).
-spec filterlist(fun((T) -> boolean()), [T]) -> [T].
filterlist (P, LL) -> lists:filter(fun(X) -> X == P end, LL).
我无法让它发挥作用。它只返回并清空列表[]。
答案 0 :(得分:1)
P
是一个谓词,这意味着一个带有值的函数ans会返回一个布尔值。
因此,您应该编写X == P
,而不是撰写P(X) == true
,而只需编写P(X)
。
问题是,现在你只需拨打lists:filter
:
filterlist(P, LL) -> lists:filter(P, LL).
如果您想要使用谓词过滤列表,请从以下开始:
filterlist(_, []) -> [],
filterlist(P, [Elem|Rest]) -> % ...
%...
保留Elem
或跳过filterlist(P, Rest)
,然后拨打{{1}}
答案 1 :(得分:1)
如果您不想使用lists:filter/2
库函数(您的函数正是lists:filter/2
所做的那样)
filterlist(P, L) -> lists:filter(P, L).
你可以使用list comprehention
filterlist(P, L) -> [ X || X<-L, P(X) ].
或自己写下
filterlist(_, []) -> [];
filterlist(P, [H|T]) ->
case P(H) of
true -> [H|filterlist(P, T)];
false -> filterlist(P, T)
end.