“gcd”函数中的模式匹配并不详尽

问题描述 投票:0回答:1

出于学习目的,我用重复减法来定义

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 关注这个定义?

haskell greatest-common-divisor
1个回答
0
投票

模式匹配并非详尽无遗。在“

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
© www.soinside.com 2019 - 2024. All rights reserved.