Я пишу функцию для упрощения булевого выражения. Например, Nand(A, A) == Not(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')
При компиляции я получаю сообщение об ошибке:
Conflicting definitions for `q'
Bound at: boolean.hs:73:21
boolean:73:29
In an equation for `simplify'
Я думаю, что понимаю, что происходит, и я работал над этим, но я просто хотел бы знать:
- Почему такое сопоставление шаблонов невозможно?
- Есть ли идиоматическое обходное решение?
Полное раскрытие: это связано с домашним заданием, но цель курса - не изучать Haskell, и я все равно решил его по-своему.