Erlang 出现错误 ** 1:之前的语法错误:'->' **
我已经开始在 Erlang 中进行一些实践,我得到: ** 1: 之前的语法错误:'->' **
每当我声明任何函数时,例如。计算列表的总和(这是实验性的,当然有内置函数用于查找列表的总和)。
sum([]) -> 0;
sum([H | T]) -> H + sum(T).
在 erl shell 中(v 5.5.5)。
提前致谢
I have started some hands on in Erlang and I am getting : ** 1: syntax error before: '->' **
whenever i am declaring any function for eg. to calculate sum of a list (this is experimental, of cource there is Built In Function for find sum of a list).
sum([]) -> 0;
sum([H | T]) -> H + sum(T).
in erl shell (v 5.5.5).
Thanks in advance
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您不能使用与 erl 文件中相同的语法在 shell 中定义函数。
不过你可以定义乐趣。
shell 中的语法需要是:
请注意,递归匿名函数(就是这个)是以一种丑陋的方式定义的。您基本上必须将函数作为参数传递给其自身。
You can't define functions in the shell using the same syntax as in an erl file.
You can define fun's though.
Syntax in the shell needs to be:
Note that recursive anonymous functions (which this is) are defined in an ugly way. You basically have to pass the function as an argument to itself.
直接的答案是,在模块定义文件中,您拥有诸如
-module().
、-export().
等属性,以及函数定义,而在 shell 中您输入要计算的表达式。函数定义不是表达式。如果您想在 shell 中定义本地临时函数,您需要使用 fun's,如 @DanielLuna 所示。这些实际上是匿名的未命名函数,因此递归地调用自己是一种痛苦,这不是 Erlang 特有的,而是所有匿名函数所共有的。
注意,
shell 中不定义了一个名为
Sum
的函数,而是定义了一个匿名函数并将变量Sum
绑定到它。这也是为什么在模块中唯一可以做的就是定义函数,而不是在加载模块时要计算的表达式。
The straight answer is that in a module definition file you have attributes, like
-module().
,-export().
etc, and function definitions, while in the shell you enter expressions to be evaluated. A function definition is not an expression.If you want to define a local, temporary function in the shell you need to use fun's as @DanielLuna has shown. These are really anonymous unnamed functions so calling themselves recursively is a pain, which is not specific to Erlang but common to all anonymous functions.
N.B.
in shell does NOT define a function called
Sum
but defines an anonymous function and binds the variableSum
to it.This is also why the only thing you can do in a module is define functions and not expressions to be evaluated when the module is loaded.
或者使用lists:foldl/2函数。这是直接从 Erlang 参考手册中复制的。
Or use the lists:foldl/2 function. This is copied directly from the Erlang Reference Manual.