1

试图弄清楚这个简单的 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).

我无法让它工作。它只返回和空列表[]。

4

2 回答 2

2

如果您不想lists:filter/2以某种方式使用库函数(您的函数正是这样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.
于 2013-04-14T21:30:30.653 回答
1

P是一个谓词,这意味着一个接受一个值并返回一个布尔值的函数。

因此,与其写作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)

于 2013-04-14T19:12:39.257 回答