2011-08-03 7 views
5

¿Cuál es la forma más sencilla de escribir una sentencia if en Erlang, donde una parte de la guardia es member(E, L), es decir, si las pruebas E es un miembro de la lista L? El enfoque ingenuo es:la comprobación de la pertenencia a un guardia de Erlang

if 
    ... andalso member(E,L) -> ... 
end 

Pero es que no funciona becuase, si he entendido bien, member no es una expresión de guardia. ¿Qué camino va a funcionar?

Respuesta

12

funcionalidad es miembro, como usted dice, no un guardia válida. En cambio, ¿podría considerar usar un patrón de caso? Es posible que incluya sus otras cláusulas if en la expresión de casos.

case {member(E,L),Expr} of 
    {true,true} -> do(), is_member; 
    {true,false} -> is_member; 
    {false,_} -> no_member 
end 
+0

Agradable. Esperaba evitar el uso de booleanos como cláusulas de caso, pero al menos me evita la necesidad de anidar una declaración de caso dentro de una declaración if. –

+1

El uso de booleanos en sentencias case es bastante común, probablemente más común que cualquier uso de "if". –

6

No es posible probar la membresía de la lista en un guardia en Erlang. Tienes que hacer esto:

f(E, L) -> 
    case lists:member(E, L) of 
     true -> ...; 
     false -> ... 
    end. 
2

Lo más fácil es considerar guardias como parte de la coincidencia de patrones, la parte que no pueden, o es difícil, expresar en el patrón mismo. Por lo tanto, un guardia es una secuencia de pruebas de protección y no expresiones booleanas. La sintaxis del guardián original hizo que fuera más fácil ver la diferencia, pero ahora se ven como expresiones booleanas, que no lo son.

Cuestiones relacionadas