Haskell中非传递性相等的Typeclass是否已有现成实现?
非传递相等场景的Haskell Typeclass探索
你提到的这种不满足传递性的"相等"关系,在数学里属于相容关系(仅满足自反性、对称性,不要求传递性),在Haskell生态和计算机领域确实有成熟的探索:
现成的解决方案与相关概念
Haskell标准库中没有专门对应这类非传递等价关系的通用Typeclass,但在特定场景的第三方库中已有落地实现:
- 处理区间计算的库(如
interval)通常会提供区间重叠检测函数,这本质就是你需要的非传递"相等"语义。 - 部分近似计算库会定义
ApproxEq类,但这类类常隐含弱传递性(比如误差累积的容忍规则),和你聚焦的区间重叠场景不完全匹配。
你实现的SubEq的优化点
你给出的代码示例中,SubEq的Uncertain实例存在自反性不满足的问题(一个区间和自身比较会返回False),这不符合相容关系的基本要求。可以修正为区间交集非空的判断,这样既满足自反、对称性,又保留非传递性:
class SubEq a where (=~=) :: a -> a -> Bool data Uncertain = Uncertain Int Int deriving (Show) instance SubEq Uncertain where -- 判断两个区间是否存在交集 (Uncertain x1 y1) =~= (Uncertain x2 y2) = x1 <= y2 && x2 <= y1 (±) :: Int -> Int -> Uncertain a ± b = Uncertain (a - b) (a + b) main = do let a = 5 ± 2 -- 区间 [3,7] let b = 7 ± 7 -- 区间 [0,14] let c = 10 ± 2 -- 区间 [8,12] print $ a =~= b -- True:[3,7] 和 [0,14] 有交集 print $ b =~= c -- True:[0,14] 和 [8,12] 有交集 print $ a =~= c -- False:[3,7] 和 [8,12] 无交集 print $ a =~= a -- True:满足自反性
领域探索现状
这类非传递等价关系在数学上早已被系统研究,在计算机领域主要应用于:
- 区间分析、模糊逻辑处理
- 近似匹配(如字符串模糊比较、数值近似判断)
- 拓扑空间中的邻域关系
由于不同场景下的非传递关系语义差异较大(比如近似相等的误差容忍规则和区间重叠逻辑完全不同),所以没有形成统一的标准Typeclass,开发者通常会根据具体需求定义专门的类型类或函数,你的实现思路是完全合理的。
内容的提问来源于stack exchange,提问作者rprospero
相关产品推荐
相关产品推荐

