【发布时间】:2014-09-10 00:38:56
【问题描述】:
我在 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).
【问题讨论】:
-
1.错误信息是什么? 2. 上一行是什么样子的? 3. Erlang不使用惰性求值,所以函数会无限循环,但这不是语法错误。
-
我会根据您的要求添加编辑,以及我正在做的更新版本。不管语法错误如何,Erlang 不使用惰性求值这一事实意味着这将不起作用。
标签: syntax erlang syntax-error