Erlang 出现错误 ** 1:之前的语法错误:'->' **

发布于 2024-09-17 19:28:22 字数 238 浏览 2 评论 0原文

我已经开始在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

鹿! 2024-09-24 19:28:22

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

不过你可以定义乐趣。

shell 中的语法需要是:

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

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

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:

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

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.

橘味果▽酱 2024-09-24 19:28:22

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

如果您想在 shell 中定义本地临时函数,您需要使用 fun's,如 @DanielLuna 所示。这些实际上是匿名的未命名函数,因此递归地调用自己是一种痛苦,这不是 Erlang 特有的,而是所有匿名函数所共有的。

注意,

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

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.

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

in shell does NOT define a function called Sum but defines an anonymous function and binds the variable Sum 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.

空袭的梦i 2024-09-24 19:28:22

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

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

Or use the lists:foldl/2 function. This is copied directly from the Erlang Reference Manual.

1> lists:foldl(fun(X, Sum) -> X + Sum end, 0, [1,2,3,4,5]).
15
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文