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

Haskell的Tree类型insert函数为何看似匹配穷尽却被GHC报非穷尽错误?

报错原因分析

你的代码逻辑本身可以覆盖所有正常运行场景,出现这个报错是GHC的模式穷尽检查机制的固有特性导致的:

  • GHC做模式穷尽检查时,不会对守卫条件的逻辑覆盖性做推导。你给Node分支写的三个守卫n < num、n > num、n == num,从逻辑上确实覆盖了两个Int值比较的所有可能结果,但GHC的检查逻辑不会验证这一点,它只会判定这个Node分支是带条件的匹配,存在所有守卫都不满足的可能性,因此认为你没有覆盖所有Node类型的入参场景,才会列出那四类未匹配的模式。
  • 额外补充:即使不考虑GHC的检查逻辑,从类型系统设计层面,Ord类型类的法则确实要求任意两个同类型值的比较结果必然满足小于、大于、等于三者其一,但GHC不会默认假设所有Ord实例都严格遵守该法则,因此也不会基于这个前提做穷尽性推导。
修复方案

只需要把最后一个守卫替换成otherwise即可,otherwise是True的别名,GHC识别到该守卫后会判定这个Node分支一定会命中,就不会再触发穷尽性报错:

data Tree = Leaf | Node Int Tree Tree
  deriving (Eq, Show, Read, Ord)

insert :: Int -> Tree -> Tree
insert n Leaf = Node n Leaf Leaf
insert n tree@(Node num lt rt)
                    | n < num  = Node num (insert n lt) rt
                    | n > num  = Node num lt (insert n rt)
                    | otherwise = tree

内容的提问来源于stack exchange,提问作者user8525706

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 19:45:03