这个匿名函数语法有什么用呢?

ale*_*pov 16 elixir

刚开始我的Elixir之旅.在书中读到这个:

"&运算符将后面的表达式转换为函数."

好吧,我想我明白了......

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

好的,&符号是匿名函数的简写及其参数.但是,为什么下次通话不起作用?!

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

......我可以继续这样看待永远:

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

这里发生了什么?

sas*_*ric 14

如果用括号包装匿名函数,它将起作用:

iex(1)> (&(&1 * &2)).()
** (BadArityError) &:erlang.*/2 with arity 2 called with no arguments
Run Code Online (Sandbox Code Playgroud)

错误是预期的,因为我们称零参数为2 arity fun.如果我们传递两个数字,我们应该看到它们相乘:

iex(2)> (&(&1 * &2)).(2,3)
6
Run Code Online (Sandbox Code Playgroud)

  • 为了澄清,这不是一个错误,你的解决方案是正确的!该点的优先级高于&有意,因此您可以编写如下内容:Enum.map(users,&& 1.name) (16认同)
  • Jose解释说@alexakarpov,dot(.)具有更高的优先级.这意味着在之前和甚至考虑之前应用点,因此将所有内容都转换为lambda.所以你的重复堆叠只相当于&((&1*&2).().().())返回一个函数.可以将其视为IO.puts 3*3*3的模拟 - 在应用IO.puts之前应用乘法.底线:如果不确定 - 使用parens :-) (3认同)
  • 啊,所以op的表达式相当于&((&1*&2).())? (2认同)
  • 对@sasajuric编写的另一个小澄清:"&((&1*&2).().().())"返回两个参数的函数,所以它是一个正确的表达式但是函数在调用时会失败,因为(&1*&2)不返回功能,因此无法调用(通过接替".()"):iex(1)>(&(&1*&2).().().()).( 3,3)**(BadFunctionError)期望一个函数,得到:9 (2认同)