Reputation: 91959
The question I am trying to solve is
Write a split(L) which returns {Even, Odd}.
The available code I have looks like
-export([even/1, odd/1, filter/2, split_using_filter/1]).
even(Integer) -> Integer rem 2 =:= 0.
odd(Integer) -> not even(Integer).
filter(F, L) -> [T || T <- L, F(T) =:= true].
split_using_filter(L) -> Even = filter(fun(X) -> X band 1 == 0 end, L),
Odd = filter(fun(X) -> X band 1 == 1 end, L),
{Even, Odd}.
What I am doing now is passing
fun(X) -> X band 1 == 0 end
as even
function and similarily for odd
Question
Is there a way to pass even(Integer)
function as argument to filter
? rather than re-writing the logic?
Thanks
Upvotes: 1
Views: 974
Reputation: 10254
Even = fun(X) -> X rem 2 =:= 0 end.
Odd = fun(X) -> X rem 2 /= 0 end.
filter(F, L) -> [T || T <- L, F(T) =:= true].
split_using_filter(L) ->
{filter(Even, L), filter(Odd, L)}.
You can read this http://learnyousomeerlang.com/higher-order-functions
Upvotes: 1
Reputation: 173
your code here:
split_using_filter(L) -> Even = filter(fun(X) -> X band 1 == 0 end, L),
Odd = filter(fun(X) -> X band 1 == 1 end, L),
{Even, Odd}.
did you mean you want to do it following???
split_using_filter(L) ->
Even = filter(fun even/1, L),
Odd = filter(fun odd/1, L),
{Even, Odd}.
Upvotes: 3