2015-01-07 18 views
5

Il problema che sto cercando di risolvere gli stativuoto Mappa del modello corrisponde anche per non vuota Mappa

Scrivere una funzione map_search_pred (Mappa, Pred), che restituisce il primo elemento {chiave, valore} nella mappa per cui Pred (Key, Value) è vero.

Il mio tentativo sembra

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

Quando eseguo questo, vedo uscita come

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> 

Come sto così sicuro? ho tirato fuori la prima clausola così sembra

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

ed eseguire nuovamente

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> 

risposta

7

Secondo map documentation:

corrispondenza espressione contro una mappa vuota letterale corrisponderà la sua digitare ma nessuna variabile sarà associata:

# {} = Espr

Questa espressione corrisponderà se l'espressione Espr è di tipo map, altrimenti fallirà con un'eccezione di badmatch.

Tuttavia erlang:map_size può essere utilizzato al posto:

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

Questo è molto meglio e soluzione elegante. Una cosa nuova che ho imparato è '[]' è 'lista vuota' ma' # {} 'non è' mappa vuota'. – daydreamer

+0

@daydreamer Questo non è vero in generale, vale solo se quei letterali sono usati come pattern. – filmor

Problemi correlati