【问题标题】:Syntax error before '->' for no apparent reason'->' 之前的语法错误,原因不明
【发布时间】: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


【解决方案1】:

erlang 中高阶函数的语法是fun(X) -&gt; X * 2 end。使用func 是语法错误。

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多