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
相关产品推荐
相关产品推荐

