2013-06-08 4 views
39

Я пытаюсь использовать square и функцию cube. Почему 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 
+2

вырезан в 'Erlang' тег от этого поста. Это больше для людей эликсира. –

ответ

44

Цитирование Алексея Sholik на эликсира-ток списка рассылки:

Обычно, & 1 делает только в функция примитивного выражения на нем принадлежит. Другими словами, он поднимает AST до первого родителя и заменяет этого родителя на fn.

Выражения типа этой работы просто отлично:

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

Но он не может участвовать в более сложном выражении.

Например, когда вы пишете:

&1 * &1 * &1

... вы пишете что-то похожее на:

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

обсуждения есть на эликсир-ядре о том поведении &1 потребностей в быть измененным, чтобы быть менее запутанным в этих случаях.

Чтобы ответить на конкретный вопрос, хотя, вы хотите что-то больше, как это:

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

Если вы хотите использовать &1, вы можете использовать простое выражение с math.pow/2:

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

. .. обратите внимание, что math.pow/2 всегда возвращает поплавок.

+0

Чем больше я использую эликсир, тем больше я чувствую, что разработчики не знают, как написать парсер. – PPPaul

53

С 0.10.3 вам необходимо поставить частичное приложение между круглыми скобками, которым предшествует оператор &.

Вы не будете иметь никаких проблем с этой версией:

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

+1 - OP @Benjamin Tan - прочитайте http://pragprog.com/book/elixir/programming-elixir за последние – Vatsala

2

Согласно последним эликсиру documentation Есть два способа создания анонимных функций:

# 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