2013-04-14 58 views
1

试图找出这个简单的Erlang过滤器问题。它应该带一个谓词和一个列表,并返回第一个列表的修改版本,其中所有对谓词返回true的元素。简单的过滤器Erlang

-module(filter). 
-export([filterlist/2]). 

-spec filterlist(fun((T) -> boolean()), [T]) -> [T]. 

filterlist (P, LL) -> lists:filter(fun(X) -> X == P end, LL). 

我不能得到它的工作。它只返回空列表[]。

+0

问题是什么? – Vinod

+0

有道理我会试一试。谢谢! – user2280297

回答

1

P是一个谓词,它表示一个函数,它接受一个值并返回一个布尔值。

因此,您应该写P(X) == true,而不是写X == P,简写为P(X)

问题是,现在你已经简称lists:filter

filterlist(P, LL) -> lists:filter(P, LL). 

如果你正在寻找筛选列表具有谓词,开始与此:

filterlist(_, [])   -> [], 
filterlist(P, [Elem|Rest]) -> % ... 

%...要么保持Elem,要么跳过它,然后致电filterlist(P, Rest)

1

如果您不喜欢使用在这样库函数(你的功能到底是什么呢lists:filter/2

filterlist(P, L) -> lists:filter(P, L). 

您可以使用列表理解中

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.