【问题标题】:Map pattern matching in function head with variable函数头中的映射模式匹配与变量
【发布时间】:2018-01-09 06:17:10
【问题描述】:

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

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。从文档来看,它似乎不是非法模式,并且确实适用于变量或列表。

那么,我是不是做错了什么(如果是,您能解释一下是什么/为什么)还是其他尚未针对地图实施的事情?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    您不能在函数头中的地图键上使用模式匹配 - 看看 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 函数一起使用。

    【讨论】:

    • 这是否意味着函数头是从右到左评估的?如果它是从左到右评估的,Head 将在评估地图模式之前设置。
    • 它们是从左到右评估的,只是在模式匹配方面地图有点特殊。而 IIRC 在涉及地图功能时,它们仍然被标记为“实验性”。
    • @ITChap 这是more comprehensive 对功能头地图支持功能的回答
    猜你喜欢
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多