使用模式匹配修复Haskell判断Formula列表全为真的eval_list函数
问题排查
- 类型不匹配:你定义的
eval_list接收[Formula]列表类型参数,但代码中递归调用eval_list f时传入的f是单个Formula类型,类型不匹配无法通过编译。 - 缺失空列表分支:没有匹配空列表的模式,传入空列表时会触发运行时匹配错误,按照“所有元素求值为真则返回真”的语义,空列表应返回
True(逻辑与的单位元)。 - 缺少单个
Formula的求值逻辑:没有针对Formula三个构造子And、Not、Con的求值实现,无法计算单个公式的布尔结果。
修复实现
首先实现单个公式的求值函数eval,再基于模式匹配实现列表的批量判断:
-- 单个Formula求值函数 eval :: Formula -> Bool eval (Con b) = b eval (Not f) = not (eval f) eval (And f1 f2) = eval f1 && eval f2 -- 修复后的列表求值函数 eval_list :: [Formula] -> Bool eval_list [] = True eval_list (f:fx) = eval f && eval_list fx
如果不需要强制显式写递归,也可以直接用标准库的all高阶函数简化实现,效果完全一致:
eval_list :: [Formula] -> Bool eval_list = all eval
测试示例
testInput :: [Formula] testInput = [And (Con True) (Not (Con False)), Con True, Not (Con False)] -- 运行 eval_list testInput 输出结果为 True
内容的提问来源于stack exchange,提问作者Drake Demarkus
相关产品推荐
相关产品推荐

