自定义`过滤器'功能使用警卫

时间:2016-07-26 18:34:44

标签: erlang

我试图编写自己的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

函数不能作为保护表达式的一部分进行评估吗?如果没有,这是怎么做的?

1 个答案:

答案 0 :(得分: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>