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