不一致的函数行为

我正在尝试一个square和一个cubefunction。 为什么square工作,而cube炸毁?

 square = &1 * &1 square.(5) 

正常工作

 cube = &1 * &1 * &1 cube.(5) 

抛出

 ** (ArithmeticError) bad argument in arithmetic expression :erlang.*(#Function<erl_eval.6.82930912>, 5) erl_eval.erl:572: :erl_eval.do_apply/6 src/elixir.erl:133: :elixir.eval_forms/3 /private/tmp/elixir-OVih/elixir-0.8.2/lib/iex/lib/iex/server.ex:19: IEx.Server.do_loop/1 

在elixir-talk邮件列表中引用Alexei Sholik:

通常,&1只将它所属的原始expression式变成函数。 换句话说,它将AST传递给第一个父代,并用fn代替该父代。

像这样的expression式工作得很好:

 &1 * &1 &1 + 2 &1 * &2 

但它不能涉及更复杂的expression。

例如,当你写:

 &1 * &1 * &1 

…你写的东西类似于:

 fn x -> fn x -> x * x end * x end 

关于elixir-core的讨论是否需要修改&1的行为以减less混淆。

为了回答你的具体问题,你需要更多的东西:

 cube = fn x -> x * x * x end 

如果你想使用&1 ,你可以使用一个简单的expression式与math.pow/2

 cube = :math.pow(&1, 3) 

…注意, math.pow/2总是返回一个浮点数。

从0.10.3开始,你需要在由&运算符开始的圆括号之间加上部分应用程序。

这个版本不会有任何问题:

 iex> square = &(&1 * &1) iex> square.(5) 25 iex> cube = &(&1 * &1 * &1) iex> cube.(5) 125 

根据最新的Elixir 文档 ,有两种创build匿名函数的方法:

 # first one, more explicit cube = fn x -> x * x * x end #second one, syntactic sugar applied cube = &(&1*&1*&1) #calling them is the same IO.puts cube.(8) # should be 512