为何GHC认为重复减法实现的gcd'函数模式匹配不完整?
为什么你的gcd'函数会触发非穷尽匹配错误?
核心原因
虽然从数学角度,任意两个整数必然满足x==y、x<y、y<x三者之一,但GHC的静态分析不会做这种深度逻辑推导。对于Integer这类无限值域的类型,编译器采取保守策略:它无法自动验证你写的三个守卫条件合起来覆盖了所有可能的输入,因此会判定存在未匹配的场景。
另外你的函数还有个不符合常规gcd定义的问题:输入负数时会返回负数结果(比如gcd' (-4) (-6)得到-2),但标准库的gcd函数返回的是正整数。
修复方案
先将输入转为绝对值(符合gcd的数学定义),同时用otherwise替代最后一个守卫条件,让编译器明确所有场景都被覆盖:
gcd' :: Integer -> Integer -> Integer gcd' x y = go (abs x) (abs y) where go a b | a == b = a | a < b = go a (b - a) | otherwise = go (a - b) b
这样既消除了编译器的报错,也让函数行为和标准库保持一致。
内容的提问来源于stack exchange,提问作者F. Zer
相关产品推荐
相关产品推荐

