【问题标题】:Simple Filter Erlang简单过滤器 Erlang
【发布时间】:2013-04-06 20:27:50
【问题描述】:

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

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

【问题讨论】:

  • 问题是什么?
  • 有道理我会试一试。谢谢!

标签: erlang


【解决方案1】:

如果您不想以这种方式使用 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.

【讨论】:

    【解决方案2】:

    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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-12
      • 2011-12-28
      • 2013-09-07
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多