2015-07-20 16 views
5

Czy można zapisać sparametryzowaną funkcję przy użyciu notacji &?Eliksir: pisanie sparametryzowanej funkcji za pomocą & Notation

Oto przykład funkcji sparametryzowane z Programowanie Elixir książce Dave Thomas

title = fn (title) -> (fn (name) -> title <> " " <> name end) end 

mrs = title.("Mrs.") 
IO.puts mrs.("Rose") 

Wyjście z powyższego programu jest:

Mrs. Rose 
[Finished in 0.6s] 

Czy title być napisane przy użyciu & notacji ? Przykład & Notacja jest podana poniżej:

iex> square = &(&1 * &1) 
#Function<6.17052888 in :erl_eval.expr/5> 

iex> square.(8) 
64 

Odpowiedz

9

Jak poprawnie zasugerował @Gazler nie jest to możliwe ze względu na ograniczenia składniowe, ale można osiągnąć podobny rezultat z częściowym zastosowaniem. Różnica polega na tym, że funkcja title zwraca wynik bezpośrednio, zamiast zwracać funkcję. Funkcja mrs może następnie wykonać częściową aplikację przez "wstępne wypełnienie" pierwszego argumentu.

title = &(&1 <> " " <> &2) 
mrs = &title.("Mrs.", &1) 
IO.puts mrs.("Rose") 
+0

Interesujące. Dzięki –

+1

Częściowa aplikacja to fajna sztuczka. – Gazler

6

To nie będzie możliwe. Próba użycia przechwytywanie (&) składnia funkcji w funkcji zadeklarowanej ze składnią przechwytywania podniesie CompileError

iex(1)> &(&(&1))  
** (CompileError) iex:2: nested captures via & are not allowed: &&1 
    (elixir) src/elixir_fn.erl:108: :elixir_fn.do_capture/4 
    (elixir) src/elixir_exp.erl:229: :elixir_exp.expand/2 
    (elixir) src/elixir_exp.erl:10: :elixir_exp.expand/2 
Powiązane problemy