2013-04-16 28 views
1

我對Erlang很新,我想編譯我的第一個程序,並且在編譯時出現語法錯誤。Erlang基礎知識:編譯時的語法錯誤

語法錯誤我得到指向第2行的指針filter_inside未定義。在X之前的最後一行也有語法錯誤。

functions.erl

-module(functions). 
-export([filteri/2]). 

filteri(_, []) -> 
        []; 
filteri(P,[X|XS]) -> 
        [(map(P) X)|filteri P XS]. 

我一直在努力,現在沒有成功調試了大約一個小時,我想知道,如果有人可以幫我鑑定它是關於什麼是使它無法代碼編譯。

非常感謝提前!

回答

2

最後一行[(map(P) X)|filter_inside P XS].應該是[P(X) | filter_inside(P, XS)]. 語法需要糾正。您正在尋找地圖應用和謂詞來取回結果,即執行lists:map

例:lists:map(fun(A)->A*2 end, [1,2,3,4,5]).得到結果等同[2,4,6,8,10]

然後在二郎你也可以這樣寫,利用尾遞歸優化:

-module(functions). 
-export([filter_inside/2]). 

filter_inside(P,L) -> 
    filter_inside(P,L, []). 

filter_inside(_, [], Acc) -> 
    lists:reverse(Acc); 
filter_inside(P,[X|XS], Acc) -> 
    filter_inside(P, XS, [P(X) | Acc]). 
+1

但是需要反轉這個列表刪除了很多收益,請參閱http://www.erlang.org/doc/efficiency_guide/myths.html#tail_recursive – rvirding

+1

我做了一段時間的運行,filter_inside2是尾遞歸'2> timer:tc(cmd,filter_inside2,[fun(A) - > A * 2 end,lists:seq(1,10000000)])。 {25707000, [2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42, 44 (cmd,filter_inside,[fun(A) - > A * 2 end,lists:seq(1,10000000)])。 {48666000, [2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42, 44 ,46,48,50,52,54 | ...]}' – Vinod

+0

在64位機器上,空間也達到了200MB左右的尾部和300MB的主體遞歸函數(通過查看進程內存使用原始方法)。列表中只有100毫秒更快:反轉被刪除,我沒有看到任何空間變化。 – Vinod

4

Erlang用分號分隔子句;

聲明以逗號分隔,。在第五行使用[];

最後一行也被打破。要將元素Head預加到列表Tail使用[Head|Tail]包括括號。

函數調用看起來像Fun(Arg1, Arg2, ...)

Erlang區分大小寫。 x是一個原子(您可能會將其視爲一個字符串常量),而X是變量X

比顯式遞歸更容易使用列表理解[Fun(X) || X <- XS](或[Fun(X) || X <- XS, Predicate(X)])。

我想你可以使用

filter_inside(Fun, XSS) -> 
    [ [Fun(X) || X <- XS] || XS <- XSS ]. 

在您的解決方案,你可以使用它作爲你的最後一行:

[list:map(P, X)|filter_inside(P, XS)]. % Mind the function call syntax. 

二郎報告的問題在-export線,因爲該功能包含一個錯誤,所以名字是未知的。

一個進一步的評論:使用filter_inside(_, [])作爲加速的最後一個條款。

+0

感謝您的答覆。在最後一行的'x'之前,我仍然遇到語法錯誤。同樣在第二行'出口',有什麼建議嗎? – AnchovyLegend

+0

我不明白你在最後一節中的意圖。 '[??| filter_inside(P,XS)]',問號會發生什麼? (Erlang語法與Haskell幾乎沒有任何相似之處,不要試圖從那裏改編) – kay

+0

這就是我來自的地方,Hasekll ...我試圖遞歸地將map和Predicate P應用到列表的每個元素列表。 (請參閱帶調整的編輯代碼) – AnchovyLegend