Elixir:使用 & 符号编写参数化函数

Elixir : Writing Parameterized Function using & Notation

是否可以使用 & 符号编写参数化函数?

这是 Programming Elixir 一书中的参数化函数示例 Dave Thomas

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

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

以上程序的输出是:

Mrs. Rose
[Finished in 0.6s]

title可以用&写吗? & 符号示例如下

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

iex> square.(8)
64

这是不可能的。尝试在使用捕获语法声明的函数中使用捕获 (&) 函数语法将引发 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

正如@Gazler 正确建议的那样,由于语法限制,这是不可能的,但您可以通过部分应用获得类似的结果。这里的区别在于 title 函数将直接 return 结果,而不是 returning 函数。然后 mrs 函数可以通过 "prefilling" 第一个参数进行部分应用。

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