I’m writing a function to simplify a Boolean expression. For example, Nand(A, A) == Not(A). I’ve tried to implement this particular rule using pattern matching, like so:
-- 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')
Upon compiling, I get the error:
Conflicting definitions for `q'
Bound at: boolean.hs:73:21
boolean:73:29
In an equation for `simplify'
I think I understand what’s going on, and I’ve worked around it, but I’d just like to know:
- Why is this sort of pattern matching not possible?
- Is there an idiomatic workaround?
Full disclosure: this is related to homework, but the purpose of the course is not to learn Haskell, and I’ve solved it my own way anyway.
You could stick to your original style:
Also, I think you should simplify before equality testing and not after: