Haskell元组函数触发Non-exhaustive patterns异常原因排查
存在问题的原代码
regiuleishon :: (Bool, Integer) -> Integer regiuleishon (True, _) = 0 reguleishon (False, x) | x >= 0 = 1 | otherwise = -1
运行时抛出异常:
Exception: pruebas.hs:13:1-26: Non-exhaustive patterns in function regiuleishon
实际测试现象:传入(True, 2)可正常返回结果0,但传入参数(False, 200)时就会触发上述异常。
错误根因
问题出在函数名拼写不一致:
- 类型签名、处理
(True, _)分支的函数名是regiuleishon(g后带字母i) - 处理
(False, x)分支的函数名误拼为reguleishon(g后直接接u,漏写了i)
Haskell中标识符拼写不同就代表完全独立的不同函数,所以你实际定义的regiuleishon函数只实现了入参第一个元素为True的匹配逻辑,根本没有定义第一个元素为False的处理分支。你写的第二个分支本质是给另一个完全无关的reguleishon函数做的定义,根本不会被regiuleishon调用到,所以传入(False, 200)时找不到可匹配的模式,直接抛出非穷尽模式的异常。
修正方案
把第二个分支的函数名拼写改对,和类型签名保持一致即可:
regiuleishon :: (Bool, Integer) -> Integer regiuleishon (True, _) = 0 regiuleishon (False, x) | x >= 0 = 1 | otherwise = -1
修正后所有入参都能正常返回结果:
regiuleishon (True, 2)返回0regiuleishon (False, 200)返回1regiuleishon (False, -5)返回-1
内容的提问来源于stack exchange,提问作者Pacorum78654
相关产品推荐
相关产品推荐

