修复Haskell中提取Formula类型Con构造子布尔值的enumerate_con函数
enumerate_con 函数修复说明
功能需求
enumerate_con函数需要遍历Formula类型值,返回其中所有Con构造子包含的布尔值组成的列表,符合以下测试用例:
- 调用
enumerate_con(Not(And(Con False)(Con True)))应当返回[False, True] - 调用
enumerate_con(And(Con False)(Con False))应当返回[False, False]
Formula类型定义如下:
data Formula = And Formula Formula | Not Formula | Con Bool deriving Show
原代码错误点
原代码存在三处核心问题:
And分支逻辑错误:只递归处理了第二个参数q2,完全未处理第一个参数q1,且重复拼接了q2的返回结果,导致收集的布尔值缺失且顺序错误Not分支逻辑错误:硬编码匹配Not后直接跟Con的场景,未覆盖Not后嵌套其他Formula结构(如And、另一个Not)的合法场景Con分支返回值类型错误:直接返回布尔值b,不符合函数声明的[Bool]返回类型要求
修复后代码
enumerate_con :: Formula -> [Bool] enumerate_con (And q1 q2) = enumerate_con q1 ++ enumerate_con q2 enumerate_con (Not f) = enumerate_con f enumerate_con (Con b) = [b]
验证说明
修复后的代码递归遍历所有Formula结构:
- 遇到
And构造子时先遍历左子公式再遍历右子公式,拼接两者结果保证顺序正确 - 遇到
Not构造子时直接递归遍历其包裹的子公式,不受嵌套结构限制 - 遇到
Con构造子时将包裹的布尔值放入列表返回,符合返回类型要求
测试两个预设用例均可得到预期结果。
内容的提问来源于stack exchange,提问作者Drake Demarkus
相关产品推荐
相关产品推荐

