Erlang得到错误** 1:语法错误之前:'->'**

Posted

技术标签:

【中文标题】Erlang得到错误** 1:语法错误之前:\'->\'**【英文标题】:Erlang getting error ** 1: syntax error before: '->' **Erlang得到错误** 1:语法错误之前:'->'** 【发布时间】:2011-04-06 11:20:11 【问题描述】:

我已经开始使用 Erlang 并得到:** 1: syntax error before: '->' ** 每当我声明任何函数时,例如。计算列表的总和(这是实验性的,当然有用于查找列表总和的内置函数)。

sum([]) -> 0;
sum([H | T]) -> H + sum(T).

在 erl shell (v 5.5.5) 中。

提前致谢

【问题讨论】:

【参考方案1】:

直接的答案是,在模块定义文件中,您有属性,如-module().-export(). 等和函数定义,而在 shell 中,您输入要计算的表达式。函数定义不是表达式。

如果你想在 shell 中定义一个本地的临时函数,你需要像@DanielLuna 所展示的那样使用 fun。这些是真正的匿名未命名函数,因此递归调用自己是一种痛苦,这不是 Erlang 特有的,而是所有匿名函数共有的。

注意

Sum = fun([], _) -> 0; ([H | T], F) -> H + F(T, F) end.

在 shell 中 NOT 定义了一个名为 Sum 的函数,但定义了一个匿名函数并将 变量 Sum 绑定到它。

这也是为什么您在模块中唯一能做的就是定义函数而不是在加载模块时要评估的表达式。

【讨论】:

谢谢,我找到了声明模块和导出函数的正确方法。【参考方案2】:

或者使用 lists:foldl/2 函数。这是直接从 Erlang 参考手册复制而来的。

1> lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
15

【讨论】:

【参考方案3】:

您不能在 shell 中使用与 erl 文件中相同的语法来定义函数。

你可以定义乐趣。

shell 中的语法必须是:

Sum = fun([], _) -> 0; ([H | T], F) -> H + F(T, F) end,
Sum([1,2,3], Sum).

请注意,递归匿名函数(就是这样)以丑陋的方式定义。您基本上必须将函数作为参数传递给自身。

【讨论】:

aka:想要在 shell 中使用函数?玩得开心! 10 年后,这仍然很难找到并理解为什么它不起作用。

以上是关于Erlang得到错误** 1:语法错误之前:'->'**的主要内容,如果未能解决你的问题,请参考以下文章

为啥 erlang spawn 函数调用中出现语法错误 - “之前的语法错误:')'”?

之前的 Erlang 语法错误:第 55 行中的 'end'

Erlang,使用警卫之前的语法错误

为什么语法错误会出现在erlang spawn函数调用中 - “语法错误之前:')'”?

为啥 Erlang 中的模式匹配记录会抛出错误

结束前的Erlang语法错误