Haskell带额外参数的模式匹配函数报错求助
解决Haskell带额外参数的模式匹配函数错误
错误原因分析
你遇到的Equations for ‘simulate’ have different numbers of arguments错误,直接原因是**XOR分支的函数定义未接收第二个参数c**,其他分支都明确写了c参数,导致函数各分支的参数数量不一致。
此外,AND和OR分支的写法也存在逻辑错误:all (simulate a c) (simulate b c)不符合all的类型要求(all需要谓词函数和列表),你实际需要的是两个布尔值的逻辑与/或,应该直接用&&和||运算符。
修正后的完整代码
-- 若使用标准库的xor,需导入该模块;也可自行实现 import Data.Bits (xor) -- 电路数据结构定义 data Circ = IN String | NOT Circ | AND Circ Circ | OR Circ Circ | XOR Circ Circ -- 实现变量查找函数(根据你的需求补充) findIn :: [(String, Bool)] -> String -> Bool findIn [] _ = error "未找到变量" findIn ((name, val):rest) target | name == target = val | otherwise = findIn rest target -- 计算电路节点数的size函数(补全所有分支) size :: Circ -> Int size (IN _) = 0 size (NOT a) = 1 + size a size (AND a b) = 1 + size a + size b size (OR a b) = 1 + size a + size b size (XOR a b) = 1 + size a + size b -- 修正后的simulate函数 simulate :: Circ -> [(String, Bool)] -> Bool simulate (IN a) c = findIn c a simulate (NOT a) c = not $ simulate a c simulate (AND a b) c = simulate a c && simulate b c simulate (OR a b) c = simulate a c || simulate b c simulate (XOR a b) c = xor (simulate a c) (simulate b c)
关键说明
- 统一参数数量:所有分支都明确接收两个参数(
Circ模式匹配结果 + 环境参数c),确保函数定义的一致性。 - 修正逻辑运算符:
AND/OR直接用&&/||组合子电路的仿真结果,符合逻辑门的语义。 - 柯里化支持部分应用:Haskell天然支持柯里化,你可以直接通过
simulate myCircuit得到一个仅接收环境参数的函数(类型为[(String, Bool)] -> Bool),满足“代入部分参数并接收额外参数”的需求。
内容的提问来源于stack exchange,提问作者spykyvenator
相关产品推荐
相关产品推荐

