Estoy escribiendo una función para simplificar una expresión booleana. Por ejemplo, Nand(A, A) == Not(A)
. He tratado de poner en práctica esta regla en particular el uso de la coincidencia de patrones, así:Implicando la igualdad en una coincidencia de patrón Haskell
-- Operands equivalent - simplify!
simplify (Nand q q) = Not (simplify q)
-- Operands must be different, so recurse.
simplify (Nand q q') = Nand (simplify q) (simplify q')
Al compilar, me sale el error:
Conflicting definitions for `q'
Bound at: boolean.hs:73:21
boolean:73:29
In an equation for `simplify'
creo que entiendo lo que está pasando, y no tengo funcionó alrededor, pero me gustaría saber:
- ¿Por qué no es posible este tipo de patrón?
- ¿Hay una solución idiomática?
La revelación completa: esto está relacionado con la tarea, pero el objetivo del curso no es aprender Haskell, y he resuelto a mi manera de todos modos.
Un patrón que utiliza una variable dos veces se denomina un no -patrón lineal. Hay idiomas que proporcionan patrones no lineales como Erlang y creo que fue una opción de diseño no incluirlos en Haskell. La publicación de la lista de correo http://www.mail-archive.com/[email protected]/msg03721.html contiene algunos argumentos en contra de los patrones no lineales, pero son argumentos de alto nivel. –
Tenga en cuenta que (Nand q q ') no implica que q y q' sean diferentes. q = 3 q '= 3 (creo que esta es la razón de la elección de diseño) –
@Vixen, bueno, si el primer patrón no coincide, significaría que son diferentes en el segundo patrón ... – dflemstr