【问题标题】:Why cannot do I get syntax errors when trying to define functions in Erlang?为什么尝试在 Erlang 中定义函数时不会出现语法错误?
【发布时间】:2015-07-27 10:15:47
【问题描述】:

我正在尝试学习 Erlang。我已经安装了一个运行时,但无法让它工作。以下代码:

X = 3.

有效,但以下语句均无效:

 f(X)->X.
 F() ->0.
 F([])->[].

我回复1: syntax error before: '->'。我从这个tutorial 尝试了word_count。我得到了同样的错误。

这里有什么问题?

【问题讨论】:

    标签: syntax erlang


    【解决方案1】:

    在 Erlang 模块和 Erlang shell (REPL) 中编写函数时,语法有所不同。正如 P_A 提到的,您需要拨打 F = fun(X) -> X end, F("Echo").

    另外请注意,函数名是原子,所以在 Erlang 模块中编写时必须以小写字母开头。如果你认真学习 Erlang,我建议你通过this

    你提到你在 F# 上工作过。在这种情况下,F# 和 Erlang 之间的基本区别在于表达式 let Lilo = [|5; 3; -3; 0; 0.5|];; 可以直接写入文件执行。在 Erlang 中,它只能在 Erlang shell 中完成,而不能在文件中完成。 因此,您尝试的表达式应该在 module 内的函数内,与文件同名。考虑 test.erl 文件。您导出的任何函数都可以从外部(shell)调用。

    -module(test).    
    -export([test/0]).    
    test() ->
        Lilo = [5, 3, -3, 0, 0.5],
        [X*2 || X <-Lilo].
    

    【讨论】:

      【解决方案2】:

      在 REPL 中你必须使用 fun(...) -&gt; ... end:

      1> F = fun(X) -> X end.
      #Fun<erl_eval.6.80484245>
      2> F(42).
      42
      

      如果文件中有代码,请使用c 命令:

      1> c(word_count).
      {ok,word_count}
      2> word_count:word_count([]).
      0
      

      【讨论】:

      • 谢谢,它现在可以在控制台中使用。但我的主要问题是它不能在 Eclipse 中编译。即使是像“ Lilo = [5, 3, -3, 0, 0.5] . Lilo 这样简单的表达式。”我收到语法错误。我在“% lists:filter(fun(X)->X>2, Lilo)”行中收到错误“syntax error before: ':'”。 (评论!!)
      • 在此代码示例中,您应该使用逗号分隔表达式:Lilo = [5, 3, -3, 0, 0.5], Lilo。
      • 还是一样(请注意,这些表达式在不同的行中,但在 Stack Overflow 上,不能在注释中放置换行符。
      • 好的,我已经把代码删掉了,保存,再粘贴。语法错误消失了,但它不应该在控制台中显示 Lilo 的内容吗?这令人困惑......到目前为止,我一直在使用 F#,并认为切换到 Erlang 不会有什么大不了的:/
      • 好的,我明白了。出于某种原因,Eclipse 不会自动“c(lilo)”。谢谢。
      猜你喜欢
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 1970-01-01
      相关资源
      最近更新 更多