Я изучаю Elixir и задаюсь вопросом, почему он имеет два типа определений функций:
- определенные в модуле с
def
, вызываемые с помощьюmyfunction(param1, param2)
- анонимные функции, определенные с помощью
fn
, вызываемые с помощьюmyfn.(param1, param2)
Только второй тип функции кажется первоклассным объектом и может передаваться как параметр другим функциям. Функция, определенная в модуле, должна быть обернута в fn
. Там какой-то синтаксический сахар, который выглядит как otherfunction(myfunction(&1, &2))
, чтобы сделать это легко, но почему это необходимо в первую очередь? Почему мы не можем просто сделать otherfunction(myfunction))
? Нужно ли разрешать вызывать функции модуля без скобок, как в Ruby? Кажется, он унаследовал эту характеристику от Erlang, которая также имеет модульные функции и развлечения, так же как это происходит на самом деле от того, как Erlang VM работает внутри?
Есть ли какое-то преимущество, имеющее два типа функций и преобразование из одного типа в другой, чтобы передать их другим функциям? Есть ли преимущество с двумя различными обозначениями для вызова функций?