2

我对 Erlang 很陌生,我正在尝试编译我的第一个程序,但在编译时出现语法错误。

我得到的语法错误指向filter_inside未定义的第 2 行。之前的最后一行还有语法错误X

函数.erl

-module(functions).
-export([filteri/2]).

filteri(_, []) -> 
                    []; 
filteri(P,[X|XS]) ->
                    [(map(P) X)|filteri P XS].

我一直在尝试调试大约一个小时,但没有成功,我想知道是否有人可以帮助我确定导致无法编译的代码是什么。

提前谢谢了!

4

2 回答 2

4

Erlang 用分号分隔子句;

语句用逗号分隔,

只需[];在第 5 行使用。

最后一行也断了。要将元素Head添加到列表中,请Tail使用[Head|Tail]括号。

函数调用看起来像Fun(Arg1, Arg2, ...).

Erlang 区分大小写。x是一个原子(您可以将其视为字符串常量),而X是变量X.

比显式递归更容易使用的是列表推导[Fun(X) || X <- XS](或[Fun(X) || X <- XS, Predicate(X)])。

我想你可以使用

filter_inside(Fun, XSS) ->
    [ [Fun(X) || X <- XS] || XS <- XSS ].

在您的解决方案中,您可以将其用作最后一行:

[list:map(P, X)|filter_inside(P, XS)].  % Mind the function call syntax.

Erlang在该-export行报告了一个问题,因为该函数包含错误,因此名称未知。

进一步的评论:filter_inside(_, [])用作加速的最后一个子句。

于 2013-04-16T16:00:51.887 回答
2

最后一行 [(map(P) X)|filter_inside P XS]. 应该是[P(X) | filter_inside(P, XS)]. 语法需要更正。您正在寻找 map apply 和 predicate 来取回结果,即 implement lists:map

例如:lists:map(fun(A)->A*2 end, [1,2,3,4,5]).获得等效的结果[2,4,6,8,10]

然后在 Erlang 中你也可以这样写来利用尾递归优化:

-module(functions).
-export([filter_inside/2]).

filter_inside(P,L) ->
    filter_inside(P,L, []).

filter_inside(_, [], Acc) -> 
    lists:reverse(Acc); 
filter_inside(P,[X|XS], Acc) ->
    filter_inside(P, XS,  [P(X) | Acc]).
于 2013-04-16T16:26:17.043 回答