无法将乐趣分配给 erlang 模块中的变量

Not able to assign fun to variable in a erlang module

我正在研究 Programming with Erlang 中的示例代码。我觉得很有趣。帮助我了解以下代码出了什么问题。

-export([totalcost/1]).

Costeach = fun(X) -> {W,Q} = X, shop:cost(W)*Q end.
sum(H|T) -> H + sum[T];
sum([]) -> 0.
totalcost(L) -> sum(lists:map(Costeach,L)).

我想要实现的是能够将变量(分配给它的乐趣)作为参数传递给地图。获取此模块的总成本

我不断收到语法错误/Costeach 未初始化错误。

您不能在顶层定义这样的函数。您有两个选择:使用您正在使用的语法但在命名函数中声明它,或者像命名函数一样声明它并使用 fun name/arity 语法将其转换为匿名函数以传递给 lists:map .

第一种方法:

sum(H|T) -> H + sum[T];
sum([]) -> 0.
totalcost(L) ->
  Costeach = fun(X) -> {W,Q} = X, shop:cost(W)*Q end.
  sum(lists:map(Costeach,L)).

第二种方法:

costeach(X) -> {W,Q} = X, shop:cost(W)*Q.
sum(H|T) -> H + sum[T];
sum([]) -> 0.
totalcost(L) -> sum(lists:map(fun costeach/1,L)).

提示:在这两种情况下,您都可以在函数参数中进行解构以节省一行代码:

Costeach = fun({W,Q}) -> shop:cost(W)*Q end.

costeach({W, Q}) -> shop:cost(W)*Q.