Haskell函数nKsets出现模式匹配非穷尽错误求排查
解决Haskell模式匹配非穷举错误
你遇到的错误是因为Haskell的模式匹配检查器无法识别你第二个分支的守卫已经覆盖了所有整数n的可能情况,它认为存在非空列表(_:_)和任意n的组合没有被匹配到。
问题根源
你的代码里,第二个模式nKsets l n带有两个守卫n <=0和n>0,虽然这两个条件在逻辑上穷尽了所有整数取值,但Haskell的检查器不会主动做这种逻辑推导,它只会机械地判断模式和守卫的显式覆盖性,因此抛出了非穷举警告。
修复方案
有两种简单的方式可以消除这个警告:
方案1:拆分守卫为独立的模式分支
把非空列表的情况拆成两个单独的模式匹配分支,让检查器清晰看到所有情况都被覆盖:
nKsets :: [Int] -> Int -> [[Int]] nKsets [] _ = error "Empty list should not be given as input" nKsets _ n | n <= 0 = [] -- 处理非空列表且n<=0的场景 nKsets l n | n > 0 = ... -- 处理非空列表且n>0的场景
方案2:用otherwise替代n>0
otherwise是Haskell里的内置常量(等价于True),用它作为最后一个守卫,检查器会明确知道所有剩余情况都被处理:
nKsets :: [Int] -> Int -> [[Int]] nKsets [] _ = error "Empty list should not be given as input" nKsets l n | n <= 0 = [] | otherwise = ... -- 这里otherwise等价于n>0,但能让检查器确认覆盖所有情况
内容的提问来源于stack exchange,提问作者JackOA
相关产品推荐
相关产品推荐

