空地图模式甚至匹配非空地图

时间:2015-01-07 22:23:29

标签: erlang

我想解决的问题是

  

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

我的尝试看起来像

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>

1 个答案:

答案 0 :(得分:9)

根据map documentation

  

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

     

#{} = Expr

     

如果表达式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.