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

Mah*_*esh 3 erlang anonymous

我正在使用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)).
Run Code Online (Sandbox Code Playgroud)

所有我想要实现的是能够传递变量(分配给它的乐趣)作为映射参数.从这个模块获得总成本

我不断收到语法错误/ Costeach没有初始化错误.

Dog*_*ert 5

您无法在顶层定义类似的功能.您有两个选择:使用您正在使用的语法,但在命名函数中声明它,或者将其声明为命名函数,并使用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)).
Run Code Online (Sandbox Code Playgroud)

第二种方法:

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

提示:在两种情况下都可以在函数参数中进行destructure以保存一行代码:

Costeach = fun({W,Q}) -> shop:cost(W)*Q end.
Run Code Online (Sandbox Code Playgroud)

要么

costeach({W, Q}) -> shop:cost(W)*Q.
Run Code Online (Sandbox Code Playgroud)

  • @ Hynek-Pichi-Vychodil这更简洁,但有一个非常重要的区别很容易错过,并且在[文档](http://erlang.org/doc/programming_examples/list_comprehensions.html)中没有明确,这是理解过滤掉非匹配元素,而function子句将崩溃. (2认同)