2010-04-06 10 views
6

Mam listę krotek, powiedzmy,Dopasowane i usuwanie elementów w liście krotek

[{x, a, y}, {x, b, y}]. 

Czy istnieje funkcja wbudowana (czy mogę użyć kombinacji BIFS), aby usunąć wszystkie krotki pasujące {x, _, y} , jak w dopasowaniu i usuwaniu na podstawie pierwszego i trzeciego terminu w krotkach, ignorując drugi?

Odpowiedz

13

Funkcja lists:filter/1 odpowiada Twoim potrzebom, np.

Ls = [{x,a,y}, {a,b,c}], 
F = fun ({x,_,y}) -> false ; (_) -> true end, 
lists:filter(F, Ls). 

Można także użyć funkcji sprawdzania listy, która jest jak kombinacja list: map/2 i list: filter/2.

[L || L <- Ls, F(L)] 

Jeśli orzecznik był przeciwny, w które chciał tylko te, które odpowiadają {x, y} _, można napisać go w następujący sposób, ponieważ generator będzie odfiltrować te nie pasujące do wzorca.

[L || {x,_,y}=L <- Ls] 
+0

Śledziłem sposób użycia list: filtr powyżej, ale jeśli chcę to zrobić ze zmienną, to nie działa. Takich jak: F = zabawa ({_, _ Kanał}) -> prawda; (_) -> fałszywy koniec, ClientsOnChannel = lists: filter (F(), NewServerState # server_st.client_channel), Wygląda na to, że kanał zostaje zdefiniowany w zakresie F. Jak mogę go filtrować na "Kanał" zdefiniowany w zewnętrznym zakresie? – Kersch