elixir - tutorial - Funciones inconsistentes del comportamiento
elixir tutorial (3)
Citando a Alexei Sholik en la lista de correo de elixir-talk:
Normalmente, & 1 solo convierte en una función la expresión primitiva a la que pertenece. En otras palabras, sube el AST al primer padre y reemplaza a ese padre con un fn.
Expresiones como esta funcionan muy bien:
&1 * &1
&1 + 2
&1 * &2
Pero no puede involucrarse en una expresión más complicada.
Por ejemplo, cuando escribes:
&1 * &1 * &1
... estás escribiendo algo parecido a:
fn x -> fn x -> x * x end * x end
Existe una discusión sobre elixir-core sobre si el comportamiento de &1
debe modificarse para ser menos confuso en estos casos.
Para responder a tu pregunta específica, sin embargo, quieres algo más como esto:
cube = fn x -> x * x * x end
Si desea usar &1
, puede usar una expresión simple con math.pow/2
:
cube = :math.pow(&1, 3)
... tenga en cuenta que math.pow/2
siempre devuelve un flotador.
Estoy probando un square
y una función de cube
. ¿Por qué el square
funciona mientras el cube
explota?
square = &1 * &1
square.(5)
Funciona bien mientras
cube = &1 * &1 * &1
cube.(5)
Tiros
** (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
De acuerdo con la última documentation Elixir documentation hay dos formas de crear funciones anónimas:
# 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
Desde 0.10.3 debe colocar la aplicación parcial entre paréntesis precedida por el operador &
.
No tendrás ningún problema con esta versión:
iex> square = &(&1 * &1)
iex> square.(5)
25
iex> cube = &(&1 * &1 * &1)
iex> cube.(5)
125