我试图解决的问题是
编写一个函数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.
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我看到输出为
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>
Run Code Online (Sandbox Code Playgroud)
我怎么这么肯定? 我拿出第一个条款就好了
map_search_pred(Map, Pred) ->
[H|_] = [{Key, Value} || {Key, Value} <- maps:to_list(Map), Pred(Key, Value) =:= true],
H.
Run Code Online (Sandbox Code Playgroud)
并再次运行
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>
Run Code Online (Sandbox Code Playgroud)
根据地图文件:
将表达式与空映射文字匹配将匹配其类型,但不会绑定任何变量:
#{} = 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.
Run Code Online (Sandbox Code Playgroud)