2013-04-14 87 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.