daydreamer
daydreamer

Reputation: 91959

How to pass functions as arguments inside modules?

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

Answers (2)

BlackMamba
BlackMamba

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

haoxian
haoxian

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

Related Questions