Otra posibilidad sería la de hacer lo que las especificaciones partido de hacer y usar el átomo '_'
en lugar de una prima _
. Entonces, se podría escribir una función similar a la siguiente:
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.
entonces, su llamada sería ahora:
member({pos, '_', '_'}, [..., {pos, 1, 2}, ...])
Esto no dejaría que coinciden con los patrones como {A, A, '_'}
(comprobando que los dos primeros los elementos son idénticos), pero si no necesitas variables, esto debería funcionar.
También podría extenderlo a utilizar variables utilizando una sintaxis similar para que coincida con las especificaciones ('$1'
, '$2'
, etc) con un poco más de trabajo - agregar un tercer parámetro a is_match
con las asociaciones de variables que hemos visto hasta ahora, luego escribe cláusulas de función para ellos similares a la cláusula para '_'
.
De acuerdo, este no será el método más rápido. Con la advertencia que realmente no he medido, espero que usar la coincidencia de patrones en el lenguaje utilizando una función divertida proporcione un rendimiento mucho mejor, aunque hace que el sitio de llamadas sea un poco más detallado. Es un compromiso que tendrás que considerar.
Esperaba evitar esto, pero parece que una función de predicado es la única forma de pasar un patrón como argumento. –
'listas: any' en realidad hace exactamente lo mismo que esta función' miembro' :) – legoscia
@legoscia Tienes razón :-) – hdima