不一致的函数行为
我正在尝试一个square
和一个cube
function。 为什么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