我正在编写一个简化布尔表达式的函数。例如,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,而是我自己解决了这个问题。
答案 0 :(得分:14)
我发现的解决方案是使用防护来检查子结构是否相等:
simplify (Nand q q')
-- Operands equivalent - simplify!
| q == q' = Not (simplify q)
-- Operands different - recurse.
| otherwise = Nand (simplify q) (simplify q')
答案 1 :(得分:2)
你可以坚持原来的风格:
-- Operands equivalent - simplify!
simplify (Nand q q') | q == q' = Not (simplify q)
-- Operands must be different, so recurse.
simplify (Nand q q') = Nand (simplify q) (simplify q')
另外,我认为你应该在平等测试之前简化,而不是在之后:
simplify (Nand q q') = if qs == qs' then Not qs else Nand qs qs' where
qs = simplify q
qs' = simplify q'
答案 2 :(得分:1)
“答案”是你不允许在一个模式中两次提到相同的变量。无论如何,不是在Haskell。解决这个问题的最佳方法是你似乎已经发现的方法 - 使用模式防护来测试平等或不平等。