solovyov.net

Erlang lists:filter

· · erlang, programming

Последние несколько дней понемногу читаю книженцию по ерлангу (давно собирался, но начал вот только-только). Очень рад, что я знаю и пользуюсь Питоном, а не каким-нибудь Перлом или C# - намного легче воспринимается передача функции в функцию, сами высокоуровневые функции - все эти filter, map.

Однако одна штука заставила меня попотеть - в книге lists:filter (кстати, интересно, что в ерланге не надо, как в питоне, очевидно импортировать модули - просто вызываешь, и всё) всегда вызывался вместе с fun (анонимной функцией, та же lambda, только покруче ;). Т.е.

lists:filter(fun(X) -> X rem 2 == 0, lists:seq(1, 10)).

И когда я пытался кинуть туда свою функцию, оно мне говорило invalid expression. :\ Такой вот код никак не работал:

is_even(X) -> X rem 2 == 0.
lists:filter(is_even, lists:seq(1, 10)).

И поиски мануала, как всегда в первый раз, приводили к тому, чему я знаю. :( Когда что-то знаешь - найти легко, а когда не понимаешь сути проблемы - начинается подбор кода к гуглю, чтоб выдал необходимое. :) В конце-концов, разобрался:

lists:filter(fun is_even/1, lists:seq(1, 10)).

Вообще вот эта штука - /1 (arity, как её в ерланге называют, или просто количество параметров) - довольно прикольная вещь. В питоне это всё реализуется опциональными параметрами, а в ерланге - просто разные функции для разного количества параметров (практически перегрузка из ООП). В некоторых случаях это будет давать несколько больше кода, в некоторых - меньше, но в сочетании с pattern matching‘ом это всё пока для меня выглядит феноменально. :)

P.S. Самое смешное, что у меня пока не получается создавать функции в интерпретаторе. Только написав отдельные модули. :(

P.P.S. Немного не хватает фич ipython’а и самодокументируемости.

P.P.P.S. Решение первых двух задач из проекта Эйлера помогает запомнить основные приёмы и синтаксис очень порядочно. :)