函数头中的变量映射模式匹配

时间:2017-08-02 07:05:18

标签: erlang

我写了一个简单的函数来获取字符串中每个字符的出现次数:

count([], Result) ->
  Result;

count([Head|Tail], #{Head := Count} = Result) ->
  count(Tail, Result#{Head := Count +1});

count([Head|Tail], Result) ->
  count(Tail, Result#{Head => 1}).

但显然地图的模式匹配有问题。 我得到variable 'Head' is unbound。从文档来看,它似乎不是一种非法模式,可以使用变量或列表。

所以,我做错了什么(如果是,你可以解释什么/为什么)或者是否还有其他尚未实现的地图呢?

1 个答案:

答案 0 :(得分:2)

您无法在功能头的地图键上使用模式匹配 - 请查看this examplethis other answer

但是,您可以使用is_key/2功能检查它是否存在。

或者,您可以使用maps:get/3的默认部分:

count([], Result) ->
  Result;

count([Head|Tail], Result) ->
  Count = maps:get(Head, Result, 0),
  count(Tail, Result#{Head => Count + 1}).

或者使用update_with/4使用setter函数。