Что с этим анонимным синтаксисом функции?

Просто начинаю путешествие в Эликсир. Читая это в книге:

"Оператор and преобразует выражение, которое следует в функцию."

ОК, я думаю, что получил это...

iex(70)> f = &(&1 * &2)
#Function<12.80484245 in :erl_eval.expr/5>
iex(72)> f.(2,3)
6

ok, амперсанд является сокращением анонимной функции и аргументами. Но тогда почему этот следующий вызов не работает?!

iex(73)> &(&1 * &2).() 
#Function<12.80484245 in :erl_eval.expr/5>

... и я могу продолжать делать это, казалось бы, навсегда:

iex(76)> &(&1 * &2).().().()
#Function<12.80484245 in :erl_eval.expr/5>

что здесь происходит?

Ответы

Ответ 1

Если вы завершите анонимную функцию круглыми скобками, она будет работать:

iex(1)> (&(&1 * &2)).()
** (BadArityError) &:erlang.*/2 with arity 2 called with no arguments

Ожидается ошибка, так как мы вызываем забаву 2 arity с нулевыми аргументами. Если мы передадим ему два числа, мы должны увидеть, что они умножаются вместе:

iex(2)> (&(&1 * &2)).(2,3)
6