我是Erlang的新手,我正在尝试编译我的第一个程序,并且在编译时遇到语法错误。
我得到的语法错误指向第2行filter_inside
未定义。在X
之前的最后一行也有语法错误。
functions.erl
-module(functions).
-export([filteri/2]).
filteri(_, []) ->
[];
filteri(P,[X|XS]) ->
[(map(P) X)|filteri P XS].
我一直试图调试大约一个小时但没有成功,我想知道是否有人可以帮助我确定代码是什么使它无法编译。
非常感谢提前!
答案 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]).