【发布时间】:2017-08-17 20:39:58
【问题描述】:
我有一个可能包含重复项的列表。我想计算列表中每个项目有多少个实例。我的计划是:
list
|> Enum.reduce(%{}, fn
item, %{item => count}=acc -> %{acc | item => count + 1}
item, acc -> Map.put(acc, item, 1)
end)
但是,编译失败并出现错误illegal use of variable item inside map key match, maps can only match on existing variable by using ^item。
所以我将第一个模式更改为item, %{^item => count}=acc。此时,错误变为unbound variable ^item。
我不确定在这里做什么。我知道可以基于另一个参数对一个参数进行模式匹配(如fn a, a -> true 用于比较函数的一个头),但显然不是在这种情况下。我试过用警卫做,但Map.has_key?/2 不能放在警卫里。我在这里发现了很多关于在地图上进行匹配的一般问题,但当匹配的值来自另一个参数时,我不会这样做。
【问题讨论】:
-
有什么理由不使用
Map.update/4?list |> Enum.reduce(%{}, fn x, acc -> Map.update(acc, x, 1, &(&1 + 1)) end). -
... 因为我没有像我想象的那样彻底阅读文档,显然。请给出答案,以便我接受。
标签: dictionary count duplicates pattern-matching elixir