başka olasılık ne maç gözlük yapmak olacak ve ham yerine atom '_'
kullanırsınız _
. Ardından, aşağıdakine benzer bir fonksiyon yazabiliriz: Sonra
member(X, List) when is_tuple(X), is_list(List) ->
member2(X, List).
% non-exported helper functions:
member2(_, []) ->
false;
member2(X, [H|T]) when not is_tuple(H); size(X) =/= size(H) ->
member2(X, T);
member2(X, [H|T]) ->
case is_match(tuple_to_list(X), tuple_to_list(H)) of
true -> true;
false -> member2(X, T)
end.
is_match([], []) ->
true;
is_match(['_'|T1], [_|T2]) ->
is_match(T1, T2);
is_match([H|T1], [H|T2]) ->
is_match(T1, T2);
is_match(_, _) ->
false.
, aramanız şimdi olacaktır:
member({pos, '_', '_'}, [..., {pos, 1, 2}, ...])
Bu {A, A, '_'}
gibi kalıplarla eşleşen izin vermedi (burada ilk iki kontrol elemanlar aynıdır), ancak değişkenlere ihtiyacınız yoksa bu işe yarayacaktır.
Ayrıca biraz daha çalışma ile özellikleri maç için benzer bir sözdizimi ('$1'
, '$2'
, vs) kullanarak değişkenleri kullanmak genişletmek olabilir - Şimdiye kadar gördüğüm değişken bağlamaları ile is_match
üçüncü bir parametre eklemek, sonra '_'
için yan tümcesine benzer işlev cümleleri yazın.
Verilen en hızlı yöntem olmayacaktır. Gerçekten ölçmediğim uyarıyla, arama sitemini biraz daha ayrıntılı hale getirmesine rağmen, eğlenceli bir dilde kullanarak desen eşlemesini kullanmayı çok daha iyi bir performans göstermesini bekliyorum. Düşünmeniz gereken bir ticaret.
sorusundan bunu yapmayı umuyordum, ama bir betimleme işlevi bir deseni argüman olarak iletmenin tek yolu. –
'listeleri: herhangi bir' aslında bu 'üye 'işleviyle aynı şeyi yapar :) – legoscia
@legoscia Haklısın :-) – hdima