Как передать функции в качестве аргументов внутри модулей?

Вопрос, который я пытаюсь решить,

Write a split(L) which returns {Even, Odd}.

Доступный код, который у меня есть, выглядит так

-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}.

То, что я делаю сейчас, проходит

fun(X) -> X band 1 == 0 end 

как функция even и аналогично для odd

Вопрос
Есть ли способ передать функцию even(Integer) в качестве аргумента функции filter? а не переписывать логику?
Спасибо


person daydreamer    schedule 06.01.2015    source источник


Ответы (2)


ваш код здесь:

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}.

Вы имели в виду, что хотите сделать это следующим???

split_using_filter(L) -> 
  Even = filter(fun even/1, L),
  Odd = filter(fun odd/1, L),
  {Even, Odd}.
person haoxian    schedule 06.01.2015
comment
Да, точно, я не был уверен, как передать even(X) в качестве аргумента. Рекомендуется/хорошая практика передавать его как fun even/1? - person daydreamer; 06.01.2015
comment
Альтернативный стиль, если функция маленькая, напишите лямбду, как ваш пример, это неплохо. Кстати, для красивого вида напишите как ответ @BlackManba, но я не думаю, что код ответа скомпилируется, он должен записать переменные Even и Odd, связывающие fun в теле функции. - person haoxian; 07.01.2015

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)}.

Вы можете прочитать это http://learnyousomeerlang.com/higher-order-functions.

person BlackMamba    schedule 06.01.2015
comment
Хотя этот блок кода может ответить на вопрос, было бы лучше, если бы вы могли объяснить, почему это происходит. - person DavidPostill; 06.01.2015