2013-06-08 9 views
39

Ich probiere eine square und eine cube Funktion aus. Warum funktioniert square arbeiten, während cube explodiert?Inkonsistente Funktionen Verhalten

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

Adaequat während

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

Wirft
** (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 
+2

den 'Erlang' Tag Edited out von diesem Beitrag. Es ist mehr für die Elixir Leute. –

Antwort

44

Zitiert Alexei Sholik auf dem Elixier-talk Mailingliste:

Normalerweise & 1 macht nur in eine Funktioniert das primitive expressi darauf gehört es. Mit anderen Worten, es geht den AST zum ersten Elternteil hinauf und ersetzt diesen Elternteil mit einem Fn.

Ausdrücke wie diese Arbeit gerade fein:

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

Aber es kann nicht in einem komplizierteren Ausdruck beteiligt sein.

Zum Beispiel, wenn Sie schreiben:

&1 * &1 * &1

... Sie schreiben so etwas wie:

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

Es gibt Diskussionen über Elixier-Kern darüber, ob das Verhalten von &1 Bedürfnisse geändert werden, um in diesen Fällen weniger verwirrend zu sein.

Ihre Frage zu beantworten, Sie eher wie dieses aber etwas wollen:

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

:

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

Wenn Sie &1 verwenden möchten, können Sie einen einfachen Ausdruck mit math.pow/2 verwenden können. .. Beachten Sie, dass math.pow/2 immer einen Float zurückgibt.

+0

Je mehr ich Elixier verwende, desto mehr fühle ich, dass die Entwickler nicht wissen, wie man einen Parser schreibt. – PPPaul

53

Seit 0.10.3 müssen Sie die Teilapplikation in Klammern mit vorangestelltem & Operator setzen.

Sie werden keine Probleme mit dieser Version haben:

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

+1 - OP @ Benjamin Tan - lesen Sie http://pragprog.com/book/elixir/programming-elixir für die neuesten – Vatsala

2

Nach der neuesten Elixir documentation gibt es zwei Möglichkeiten anonyme Funktionen zu erstellen:

# 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 
Verwandte Themen