Sto scrivendo una funzione per semplificare un'espressione booleana. Ad esempio, Nand(A, A) == Not(A)
. Ho cercato di attuare questa regola particolare utilizzando pattern matching, in questo modo:L'uguaglianza implicita in un modello Haskell corrisponde a
-- 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')
Su compilazione, ottengo l'errore:
Conflicting definitions for `q'
Bound at: boolean.hs:73:21
boolean:73:29
In an equation for `simplify'
Credo di capire cosa sta succedendo, e non ho intorno a questo, ma vorrei solo sapere:
- Perché questo tipo di abbinamento di pattern non è possibile?
- Esiste una soluzione idiomatica?
Full disclosure: questo è legato al lavoro, ma lo scopo del corso è di non imparare Haskell, e ho risolto a modo mio in ogni caso.
Un modello che utilizza una variabile due volte è chiamato non modello lineare. Ci sono linguaggi che forniscono modelli non lineari come Erlang e penso che sia stata una scelta di design non includerli in Haskell. La mailing list post http://www.mail-archive.com/[email protected]/msg03721.html contiene alcuni argomenti contro i pattern non lineari ma sono argomenti piuttosto di alto livello. –
Nota che (Nand q q ') non implica che q eq' siano diversi. q = 3 q '= 3 (penso che questo sia il motivo della scelta del design) –
@Vixen, beh, se il primo modello non corrispondesse, significherebbe che sono diversi nel secondo modello ... – dflemstr