Haskell 中使用模式匹配的手动 gcd 函数

Manual gcd function in Haskell using pattern matching


Haskell初学者来了!我正在解决一个练习题,我尝试使用模式匹配概念制作一个手动 gcd 函数,到目前为止我已经尝试了以下方法:

myGcdPM :: Int -> Int -> Int
myGcdPM x 0 = x
myGcdPM x y = myGcdPM y (mod x y)

代码似乎有效,但我想了解这是否是一个合适的 PM 和有效的解决方案?

如果你查一下the source of the standard implementation (if you didn't know where to find that: ask Hoogle),你会发现它和你的几乎一样:

gcd x y         =  gcd' (abs x) (abs y)
                   where gcd' a 0  =  a
                         gcd' a b  =  gcd' b (a `rem` b)

嗯,兴趣的定义真的是gcd':

gcd' a 0  =  a
gcd' a b  =  gcd' b (a `rem` b)

与你的唯一区别是它使用 rem 而不是 mod(但在正输入上它们的行为相同)并且它以中缀表示法(a `rem` brem a b).

相同

然后,gcd x y = gcd' (abs x) (abs y) 只是包装整个东西,确保输入是非负的。