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

时间:2015-11-13 15:32:04

标签: function enums functional-programming elixir arity

让我说我有类似的东西:

    Enum.map(list, fn(x) -> String.duplicate("a", someValue * x) end)

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

Enum.map(list, &String.duplicate/2)

我知道你可以为arity 1函数做到这一点:

Enum.map(list, &String.downcase/1)

谢谢!

1 个答案:

答案 0 :(得分:20)

您无法将函数传递给Enum.map,其中Enum.map调用您的函数,并将列表中的每个元素作为参数传递给Enum.reduce。如果你使用像String.downcase/1这样的另一个函数,那么它需要一个arity为2的函数。

这是使用列表中的每个项目调用Enum.map(["FOO", "BAR", "BAZ"], fn(x) -> String.downcase(x) end) # String.downcase("FOO") # String.downcase("BAR") # String.downcase("BAZ") 函数的示例:

String.duplicate/2

在您的重复示例中,您尝试使用单个参数(字符串“FOO”)调用Enum.map([1,2,3], &String.duplicate("a", &1))

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

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

def duplicate_foo(times), do: String.duplicate("a", times)

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

class EmployeeListView(generics.ListAPIView):
    queryset = Employee.objects.all()
    serializer = EmployeeSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('id', 'employee_type', 'rfid_tag')
    search_fields = ('event_type', 'employee_status')
    ordering_fields = ('id', 'employee_type')