You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 04:12:49