2016-07-26 24 views
-1

我試圖寫我自己的filter函數並且遇到錯誤。代碼:使用衛士定製`過濾器`功能

filter_acc(_, [], Result) -> Result; 
filter_acc(F, [H|T], Result) when F(H) =:= true -> filter_acc(F, T, [H | Result]). 
filter(F, L) -> filter_acc(F, L, []). 

錯誤:

my_functions.erl:11: illegal guard expression 
error 

能功能不被評估爲保護表達式的一部分嗎?如果不是,這是怎麼做的?

+0

爲了保證性能,只有少量的短BIF和比較允許在守衛中(例外:長度可能很長,如果列表很大)。 – Pascal

+2

@Pascal它不只是表現。 「if」塊中的守衛和條件語句不能運行具有副作用的代碼,因此它們限制了已知爲副作用的函數。 – RichN

回答

1

你可以像這樣實現它(只有函數子句,不需要守衛),但恐怕它沒什麼興趣。

1> FA = fun FA(_,[H],true,R) -> [H|R]; 
1> FA(_,[_],_,R) -> R; 
1> FA(F,[H1,H2|T],true,R) -> FA(F,[H2|T],F(H2),[H1|R]); 
1> FA(F,[_,H2|T],_,R) -> FA(F,[H2|T],F(H2),R) end. 
#Fun<erl_eval.28.50752066> 
2> Filter = fun(_,[]) -> []; (F,L= [H|_]) -> FA(F,L,F(H),[]) end. 
#Fun<erl_eval.12.50752066> 
3> Filter(fun(X) -> X > 4 end,[1,2,5,hello,"Joe"]). 
["Joe",hello,5] 
4> 
+0

超過利息,我資助這個威脅! :D謝謝你的努力,但。我很快就會研究它。 :-) – dotslash