我在Erlang脚本文件中定义了一些函数,并在main中调用它们来证明它们的正确性。到目前为止我没有遇到任何问题,但突然之间我没有真正的理由得到错误。这是有问题的代码(我通过评论来检查这行是问题):
fibSeq() -> [0] ++ [1] ++ lists:zipwith(func(X, Y) -> X + Y end, fibs(), lists:delete(0, fibSeq())).
这个功能背后的想法是有效地计算斐波纳契数列。由于函数的无限递归性质,可能会出现错误,但是我相信我读到Erlang使用了懒惰的评估,所以我觉得这应该有效。
修改:使用此设置为list:sublist(fibSeq(), N)
或list:nth(N, fibSeq())
,其中N
是整数。
编辑2:
错误消息是"Syntax error before '->'"
,参考fibSeq()函数上方的第一行,以及之前的代码
merge([], []) -> [];
merge(A, []) -> A;
merge([], B) -> B;
merge([A|As], [B|Bs]) when A < B -> [A] ++ merge(As, [B] ++ Bs);
merge([A|As], [B|Bs]) -> [B] ++ merge([A] ++ As, Bs).
mergesort([]) -> [];
mergesort([A]) -> [A];
mergesort(As) ->
merge(mergesort(lists:sublist(As, length(As) div 2)), mergesort(lists:sublist(As, length(As) div 2 + 1, length(As) div 2 + 1))).
我已经改变了我的斐波那契代码,使用了我之后想到的不同的线性评估:
fib(N) when N >= 0, is_integer(N) -> fibHelp(0, 1, N).
fibHelp(L, _, 0) -> L;
fibHelp(L, H, A) when A > 0, is_integer(L), is_integer(H), is_integer(A) ->
fibHelp(H, L+H, A - 1).
答案 0 :(得分:3)
erlang中高阶函数的语法是fun(X) -> X * 2 end
。使用func
是语法错误。