Functional programming 如何在Map.update中使用非lambda函数?

Functional programming 如何在Map.update中使用非lambda函数?,functional-programming,hashmap,elixir,Functional Programming,Hashmap,Elixir,我肯定我错过了一些明显的东西,但我无法使用外部定义的一元函数来使用Map.update,我认为这应该是可行的。长生不老药抱怨: ** (UndefinedFunctionError) function xxx/0 is undefined or private. Did you mean one of: * xxx/1 Map.update的作用不正是为了拥有一个函数,该函数接受被更新的值并返回一个新值吗?为什么它需要一个零算术函数?这似乎没有多大意义。我想我只是有点累了,但我就是无法理

我肯定我错过了一些明显的东西,但我无法使用外部定义的一元函数来使用
Map.update
,我认为这应该是可行的。长生不老药抱怨:

** (UndefinedFunctionError) function xxx/0 is undefined or private. Did you mean one of:

  * xxx/1

Map.update
的作用不正是为了拥有一个函数,该函数接受被更新的值并返回一个新值吗?为什么它需要一个零算术函数?这似乎没有多大意义。我想我只是有点累了,但我就是无法理解这一点。

假设我们有以下代码

defmodule Foo do
  def add_one(x), do: x + 1
end
我们可以使用Map.update/4,如下所示

Map.update(my_map, :a, 3, &Foo.add_one/1)
您可以在iex会话中看到这一点

iex(1)> my_map = %{b: 3}
%{b: 3}
iex(2)> Map.update(my_map, :a, 3, &Foo.add_one/1)
%{a: 3, b: 3}

iex(4)> my_map = %{a: 12}
%{a: 12}
iex(5)> Map.update(my_map, :a, 3, &Foo.add_one/1)
%{a: 13}

我假设您正在尝试使用
Map.update(我的地图,:a,3,Foo.add\u one)
。执行此操作时,编译器将尝试调用名为
Foo.add_one
的函数,并将结果值传递给该函数。在您的情况下,该函数不存在,因此它会给您一个错误。还要注意函数名前的
&
,以及函数名末尾的
/1

&
基本上告诉程序将函数作为参数传递,而不是调用函数并传递结果值

/1
说明程序应该查找一个具有该名称的函数,该函数的arity(函数的参数数)为1