2016-07-26 21 views
-1

私自身がfilter関数を書こうとしていて、エラーが発生しました。コード:ガードを使用したカスタム `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

関連する問題