vida tutorial sinonimo programaciĆ³n lenguaje learn inmortal framework elixir

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