Hatena::Grouperlang

msyktの日記

 | 

2013-12-14

3.10 case式とif式

19:56

しかし、この定義はもう1つの(filter1という)関数を作ってfilter/2の引数をすべてその関数に渡すようにする必要があるので、かなり見苦しい。

filter1という関数名を使わず、filter1/4→filter/4にしたらどうだろう?

-module(test310).
-compile(export_all).

filter(P, [H|T]) ->
    filter(P(H), H, P, T);
filter(P, []) -> [];
filter(true, H, P, T) ->
    [H|filter(P, T)];
filter(false, H, P, T) ->
    filter(P, T).
Eshell V5.10.3  (abort with ^G)
1> c(test310).
test310.erl:7: head mismatch
error

コンパイルできなかった。アリティが違うと別関数なので;(セミコロン)で続けることはできなかった。filter/2とfilter/4で分けてみる。

-module(test310).
-compile(export_all).

filter(P, [H|T]) ->
    filter(P(H), H, P, T);
filter(P, []) -> [].

filter(true, H, P, T) ->
    [H|filter(P, T)];
filter(false, H, P, T) ->
    filter(P, T).
Eshell V5.10.3  (abort with ^G)
1> c(test310).
test310.erl:6: Warning: variable 'P' is unused
test310.erl:10: Warning: variable 'H' is unused
{ok,test310}
2> test310:filter(fun(X) -> X rem 2 =:= 0 end, [0,1,2,3,4,5]).
[0,2,4]

こちらは問題なく動く。別関数に渡すのが見苦しい、ということですかね。

 |