【问题标题】:Empty Map Pattern matches even for non-empty Map空地图模式匹配,即使是非空地图
【发布时间】:2015-01-08 15:23:02
【问题描述】:

我试图解决的问题

写一个函数 map_search_pred(Map, Pred) 返回第一个 映射中 Pred(Key, Value) 为 true 的元素 {Key,Value}。

我的尝试看起来像

map_search_pred(#{}, _)     -> {};
map_search_pred(Map, Pred)  ->
  [H|_] = [{Key, Value} || {Key, Value} <- maps:to_list(Map), Pred(Key, Value) =:= true],
  H.

当我运行它时,我看到输出为

1> lib_misc:map_search_pred(#{1 => 1, 2 => 3}, fun(X, Y) -> X =:= Y end).
{}
2> lib_misc:map_search_pred(#{1 => 1, 2 => 3}, fun(X, Y) -> X =:= Y end).
{}
3> maps:size(#{}).
0
4> 

我怎么这么确定? 我拔出了第一个子句,所以它看起来像

map_search_pred(Map, Pred)  ->
  [H|_] = [{Key, Value} || {Key, Value} <- maps:to_list(Map), Pred(Key, Value) =:= true],
  H.

然后再次运行

1> lib_misc:map_search_pred(#{1 => 1, 2 => 3}, fun(X, Y) -> X =:= Y end).
{1,1}
2> lib_misc:map_search_pred(#{}, fun(X, Y) -> X =:= Y end).
** exception error: no match of right hand side value []
     in function  lib_misc:map_search_pred/2 (/Users/harith/code/IdeaProjects/others/erlang/programmingErlang/src/lib_misc.erl, line 42)
3>

【问题讨论】:

    标签: erlang


    【解决方案1】:

    根据map documentation

    将表达式与空映射文字匹配将匹配其类型,但不会绑定任何变量:

    #{} = 表达式

    如果表达式 Expr 是 map 类型,则该表达式将匹配,否则将失败并出现异常 badmatch。

    但是可以使用erlang:map_size 代替:

    map_search_pred(Map, _) when map_size(Map) == 0 ->
      {};
    map_search_pred(Map, Pred) ->
      [H|_] = [{Key, Value} || {Key, Value} <- maps:to_list(Map), Pred(Key, Value) =:= true],
      H.
    

    【讨论】:

    • 这是一个更好更优雅的解决方案。我学到的一个新东西是[]empty list#{} 不是empty map
    • @daydreamer 这通常不是真的,只有当这些文字被用作模式时才成立。
    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2021-12-07
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多