简单过滤Erlang

时间:2013-04-14 19:01:03

标签: erlang

试图找出这个简单的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).

我无法让它发挥作用。它只返回并清空列表[]。

2 个答案:

答案 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.