2010-08-31 41 views
13

我已經開始在Erlang中進行一些操作,並且我得到:** 1: syntax error before: '->' **每當我爲例如聲明任何函數時。來計算一個列表的總和(這是實驗性的,有一個列表查找和的內置函數)。Erlang獲取錯誤** 1:語法錯誤之前:' - >'**

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

in erl shell(v 5.5.5)。

在此先感謝

回答

34

您不能定義使用相同的語法在外殼的功能在ERL文件。

雖然你可以定義樂趣。

語法在外殼需要是:

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

注意,遞歸的匿名函數(這是)的醜陋的方式進行定義。您基本上必須將該函數作爲參數傳遞給它自己。

+4

aka:想要shell中的函數嗎?玩的開心! – 2010-09-01 04:14:19

+1

我希望錯誤消息更有幫助。 – dotslash 2016-07-25 04:52:32

8

直接的答案是,在模塊定義文件中,您有屬性,如-module().,-export().等,以及函數定義,而在shell中輸入要評估的表達式。函數定義不是表達式。

如果你想在shell中定義一個本地臨時函數,你需要像@DanielLuna所顯示的那樣使用fun。這些都是匿名匿名函數,所以遞歸調用是一種痛苦,並不是Erlang特有的,而是所有匿名函數都通用的。

N.B.

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

確實NOT定義了一個名爲Sum功能,但定義了一個匿名功能和結合可變Sum它。

這也是爲什麼你可以在模塊中做的唯一事情是定義函數,而不是在模塊加載時被評估的表達式。

+0

謝謝,我有正確的方式來聲明模塊和導出函數。 – pranjal 2010-09-02 05:47:50

0

或使用列表:foldl/2函數。這是從Erlang參考手冊直接複製的。

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