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

Haskell中Data.Set.Set的case匹配为何忽略相等性?

模式匹配与Eq实例的核心区别

首先明确:模式匹配和Eq实例是完全独立的机制,前者根本不是基于后者实现的。

Set的Eq实例逻辑

Data.Set.Set的Eq实例是按照集合的数学定义实现的——只要两个集合包含的元素完全一致,不管元素顺序如何,==都会返回True。比如你测试的:

> S.fromList [] == S.fromList [1,2]
False
> S.fromList [1,2] == S.fromList [2,1]
True

这个结果完全符合预期,因为集合本身是无序的。

为什么你的case语句总是返回True?

你写的这段代码:

case S.fromList [1,2] of mempty -> True

这里的mempty并不是在匹配空集合,而是一个小写开头的变量模式。在Haskell的模式匹配规则里,小写开头的标识符会被当作变量,它会匹配任何输入值,同时把输入值绑定到这个变量名上。不管你传入的是啥集合,这个模式都会匹配成功,所以代码必然返回True。

因为Set是抽象数据类型,它没有暴露空集合的构造器供你直接模式匹配,所以判断空集合的正确方式就是用S.null函数,这也是你已经知道的正确做法。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:42:05