Elixir:使用&Notation编写参数化函数

Wan*_*ker 5 elixir

是否可以使用¬ation编写参数化函数?

以下是Dave Thomas的Programming Elixir一书中参数化函数的一个例子

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

mrs = title.("Mrs.")
IO.puts mrs.("Rose")
Run Code Online (Sandbox Code Playgroud)

上述计划的输出是:

Mrs. Rose
[Finished in 0.6s]
Run Code Online (Sandbox Code Playgroud)

可以title使用&符号编写吗?以下给出了符号的示例

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

iex> square.(8)
64
Run Code Online (Sandbox Code Playgroud)

Pat*_*ity 9

正如@Gazler正确建议的那样,由于语法限制,这是不可能的,但是您可以通过部分应用程序获得类似的结果.这里的不同之处在于title函数将直接返回结果,而不是返回函数.mrs然后,该函数可以通过"预填充"第一个参数来进行部分应用.

title = &(&1 <> " "  <> &2)
mrs = &title.("Mrs.", &1)
IO.puts mrs.("Rose")
Run Code Online (Sandbox Code Playgroud)


Gaz*_*ler 6

这是不可能的.尝试在使用捕获&语法声明的函数中使用capture()函数语法将引发aCompileError

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
Run Code Online (Sandbox Code Playgroud)