solovyov.net

Erlang lists:filter

2 min read · 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. Решение первых двух задач из проекта Эйлера помогает запомнить основные приёмы и синтаксис очень порядочно. :)

If you like what you read — subscribe to my Twitter, I always post links to new posts there. Or, in case you're an old school person longing for an ancient technology, put a link to my RSS feed in your feed reader (it's actually Atom feed, but who cares).

Other recent posts

Server-Sent Events, but with POST
ngrok for the wicked, or expose your ports comfortably
PostgreSQL collation
History Snapshotting in TwinSpark
Code streaming: hundred ounces of nuances