Erlang基础:编译时出现语法错误

时间:2013-04-16 15:58:27

标签: erlang

我是Erlang的新手,我正在尝试编译我的第一个程序,并且在编译时遇到语法错误。

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

functions.erl

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

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

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

非常感谢提前!

2 个答案:

答案 0 :(得分: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(_, [])作为加速的最后一个条款。

答案 1 :(得分:2)

上一行[(map(P) X)|filter_inside P XS].应为[P(X) | filter_inside(P, XS)]. 语法需要纠正。您正在寻找map apply和predicate来获取结果,即实现lists:map

Ex: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]).