2015-01-07 8 views
5

Problem usiłuję rozwiązać stanyEmpty Mapa wzorzec pasuje nawet dla niepustego mapą

Napisz funkcję map_search_pred (Map, Pred), która zwraca pierwszy elementu {key, value} na mapie dla których Pred (klucz, wartość) jest prawdziwe.

Moja próba wygląda

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

Gdy uruchomię to widzę wyjścia jak

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> 

Jak jestem taki pewien? Wyciągnąłem pierwszy klauzuli tak wygląda

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

i uruchom ponownie

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> 

Odpowiedz

7

Według map documentation:

Dopasowane wyrażenie przeciwko pustym mapie dosłownym będzie pasował do jego typ, ale zmienne nie zostaną zmienione:

# {} = Expr

To wyrażenie będzie pasować, jeśli wyrażenie Expr jest typu mapa, w przeciwnym razie zakończy się niepowodzeniem z wyjątkiem badmatch.

Jednak erlang:map_size może być stosowany zamiast:

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. 
+1

Jest to o wiele lepiej i eleganckie rozwiązanie. Nową rzeczą, której się nauczyłem, jest '[]' jest 'pustą listą', ale' # {} 'nie jest' pustą mapą'. – daydreamer

+0

@daydreamer To nie jest prawda w ogóle, zachowuje się tylko wtedy, gdy te literały są używane jako wzorce. – filmor

Powiązane problemy