14

Estoy aprendiendo Erlang del libro web LearnYouSomeErlang. Una cosa que me sorprendió al aprender fue la conjunción booleana sin cortocircuito y los operadores de disyunción; and y or. ¿Cuáles son los casos de uso para estos operadores? ¿Por qué querría usarlos en lugar de andalso y orelse?¿Cuál es el uso de operadores booleanos sin cortocircuito en Erlang?

+0

Etiquetado con 'Programación lógica' porque me dijeron que esto tiene algo que ver con los orígenes de Erlang en Prolog. – missingfaktor

+0

Relacionado: [Cuándo preferir 'y' a' andalso' en las pruebas de guardia] (http://stackoverflow.com/questions/6025132/when-to-prefer-and-over-andalso-in-guard-tests). – kay

Respuesta

12

Solía ​​ser (hasta R13A) que andalso y orelse no eran cola recursiva. Ver http://www.erlang.org/eeps/eep-0017.html para más detalles. No creo que haya una buena razón para usar and/or en nuevos programas.

+0

Enlace de interés. ¡Gracias por la respuesta! – missingfaktor

4

Los operadores y/o son simplemente mucho más antiguos. Los operadores andalso/orelse son adiciones posteriores. Un caso de uso para y/o hoy podría serlo cuando solo desea realizar algunas operaciones booleanas simples y el espacio horizontal es más importante que posiblemente guardar un par de ciclos de la máquina. Por ejemplo:

X = Y and (A or B), 

en lugar de

X = Y andalso (A orelse B), 

es un poco más fácil en los ojos.

Por razones de compatibilidad con versiones anteriores, no fue posible cambiar el comportamiento del original y/o provocar un cortocircuito, por lo que se necesitaron nuevas palabras clave. Los nombres andalso/orelse provienen de ML estándar.

5

los veo como hacer las cosas diferentes y usarlos como tales:

  • and/or operadores lógicos en el que necesito para comparar los valores lógicos. Como son estrictos, recibo automáticamente la verificación de tipo e I CONOCER exactamente como se ha llamado.
  • andalso/orelse para el control, al igual que && y || en C.

errores Seeing se definen en Erlang siento que es bueno saber lo que se ha ejecutado y cómo ha ido.

+0

1. 'andalso' y' orelse' también se pueden usar como operadores lógicos. 2. No entendí lo de la verificación de tipos. 3. Conocer lo que se ha llamado no debería importar con expresiones referencialmente transparentes; solo es relevante en el contexto de los efectos secundarios. – missingfaktor

+0

Creo que lo que Robert está diciendo es que a veces uno quiere que todos los operandos sean evaluados para que puedan generar excepciones, incluso si no son necesarios para la evaluación del predicado. Es un buen punto. – dsmith

+0

@dsmith: Sí, tanto eso como para comprobar que realmente devuelven valores booleanos. Tal vez estoy siendo excesivamente prudente, pero es bueno detectar errores tan pronto como sea posible. – rvirding

Cuestiones relacionadas