如何在Elixir for Enum.map中传递arity 2的函数作为参数?

Sas*_*eca 10 enums functional-programming function elixir arity

假设我有类似的东西:

    Enum.map(list, fn(x) -> String.duplicate("a", someValue * x) end)
Run Code Online (Sandbox Code Playgroud)

但相反,我想将String.duplicate/2函数作为参数传递,以简化我的代码:

Enum.map(list, &String.duplicate/2)
Run Code Online (Sandbox Code Playgroud)

我知道你可以为arity 1功能做到这一点:

Enum.map(list, &String.downcase/1)
Run Code Online (Sandbox Code Playgroud)

谢谢!

Gaz*_*ler 21

您不能将函数传递给Enum.maparity为2,因为Enum.map调用函数时列表中的每个元素都作为参数.如果你使用像那样的另一个函数,Enum.reduce它需要一个arity为2的函数.

这是使用String.downcase/1列表中的每个项目调用的函数的示例:

Enum.map(["FOO", "BAR", "BAZ"], fn(x) -> String.downcase(x) end)
# String.downcase("FOO")
# String.downcase("BAR")
# String.downcase("BAZ")
Run Code Online (Sandbox Code Playgroud)

在您的重复示例中,您尝试String.duplicate/2使用单个参数(字符串"FOO")进行调用.

您可以使用捕获语法来创建函数(这是定义您提供的函数的简写方法):

Enum.map([1,2,3], &String.duplicate("a", &1))
Run Code Online (Sandbox Code Playgroud)

您还可以在模块中定义一个只需要一个参数的命名函数,例如:

Enum.map([1, 2, 3], &duplicate_foo/1)

def duplicate_foo(times), do: String.duplicate("a", times)
Run Code Online (Sandbox Code Playgroud)