Haskell条件析取函数实现及语法错误排查求助
问题解决与代码实现
语法错误原因
你遇到的parse error on input ‘=’是因为Haskell对缩进有严格要求,同一函数的所有定义行必须保持相同的缩进级别。你的代码中每行前面的空格数不一致,导致编译器无法正确解析函数定义。
符合需求的正确实现
根据需求,我们需要实现一个函数:输入长度为3的倍数的布尔列表,对每个不重叠的三元组(第1-3、4-6…个元素)应用“条件析取”操作,将结果替换该三元组的第三个元素,最终返回处理后的列表。
完整代码
-- 定义条件析取操作:(¬q ∨ p) ∧ (q ∨ r) condDisj :: Bool -> Bool -> Bool -> Bool condDisj p q r = (not q || p) && (q || r) -- 主函数:处理长度为3倍数的布尔列表 calc :: [Bool] -> [Bool] calc [] = [] -- 匹配三个元素的组,计算后替换第三个元素,递归处理剩余部分 calc (p:q:r:xs) = p : q : condDisj p q r : calc xs -- 处理长度非3倍数的错误情况 calc _ = error "输入列表长度必须是3的倍数"
使用示例
示例1:长度为3的简单列表
calc [True, False, True] -- 输出:[True, False, True] -- 计算过程:(not False || True) ∧ (False || True) = True ∧ True = True
示例2:长度为6的混合布尔列表
calc [True, True, False, False, False, True] -- 输出:[True, True, True, False, False, True] -- 第一个三元组计算:(not True || True) ∧ (True || False) = True ∧ True = True -- 第二个三元组计算:(not False || False) ∧ (False || True) = True ∧ True = True
示例3:全False的列表
calc [False, False, False, False, False, False] -- 输出:[False, False, False, False, False, False] -- 每个三元组计算:(not False || False) ∧ (False || False) = True ∧ False = False
原代码逻辑的修正(返回单个Bool值)
如果你原本的意图是将列表逐步折叠为单个布尔值(每次处理前三个元素,将结果与后续元素继续递归处理),修正缩进后的代码如下:
calc :: [Bool] -> Bool calc [] = False calc [_] = False calc [_, _] = False calc [p, q, r] = (not q || p) && (q || r) calc (p:q:r:xs) = calc $ (not q || p) && (q || r) : r : xs
注意:此逻辑下输入长度为3的倍数时,递归过程中列表长度会逐渐减少,最终得到单个布尔值,但不符合需求中“将操作结果作为中间列表的第k+2个元素”的描述,建议使用前面的列表处理版本。
内容的提问来源于stack exchange,提问作者Dippppa
相关产品推荐
相关产品推荐

