出于学习目的,我用重复减法来定义
gcd'
函数:
gcd' :: Integer -> Integer -> Integer
gcd' x y
| x == y = x
| x < y = gcd' x (y - x)
| y < x = gcd' (x - y) y
(Prelude 的 gcd 功能)
问题是GHC对此抱怨:
模式匹配并非详尽无遗。 在‘gcd’的方程中:
“Integer”、“Integer”类型的模式不匹配:_ _
我看过一个关于数字的数学定律,它说:
对于所有数字 𝑥 和 𝑦,𝑥 小于 𝑦,或 𝑦 小于 𝑥,或 𝑥 等于 𝑦。
从这个意义上说,这三个守卫涵盖了所有可能的情况。为什么 GHC 关注这个定义?
模式匹配并非详尽无遗。在“
”的等式中:gcd
问题在于,Haskell 并不聪明,知道对于
x
和 y
这两个项,它总是认为 x < y
、x > y
或 x == y
成立,而实际上它甚至不成立。事实上,对于 NaN
,它不成立:
ghci> nan = 0/0
ghci> nan
NaN
ghci> nan == nan
False
ghci> nan > nan
False
ghci> nan < nan
False
最好使用始终为真的条件:
otherwise
,它是 True
: 的别名
gcd' :: Integer -> Integer -> Integer
gcd' x y
| x == y = x
| x < y = gcd' x (y - x)
| otherwise = gcd' (x - y) y