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

为何Erlang中互为变位词的字符串转Set后交集与原Set不相等

问题原因

你遇到的这个现象和Erlang sets 模块的底层实现逻辑直接相关,核心问题出在你用了=:=运算符判断集合相等,这是不符合Erlang sets模块使用规范的。

具体原因拆解

  • Erlang的=:=是严格相等运算符,对于复合数据类型,它会校验底层存储结构的完全一致,而不是校验数据的业务逻辑等价。
  • 你之前测试Set1 =:= Set2返回true属于巧合:两个变位词的字符经过sets:from_list处理后,生成的底层存储结构刚好完全一致,不代表所有逻辑等价的set用=:=判断都会返回true。
  • sets:intersection生成的集合虽然逻辑上和Set1、Set2的元素完全相同,但交集计算逻辑生成的底层存储结构(默认是基于平衡树的嵌套tuple结构)和from_list生成的结构有差异,因此=:=判定为false。

正确用法

判断两个集合逻辑相等应该使用sets模块提供的sets:is_equal/2函数,你可以运行下面的代码验证:

sets:is_equal(Intersection, Set1). %% 返回true
sets:is_equal(Intersection, Set2). %% 返回true

补充说明

从OTP 24版本开始,sets模块新增了基于Map的第二代实现,你可以在创建集合时指定版本2:

Set1 = sets:from_list("orchestra", [{version, 2}]).
Set2 = sets:from_list("carthorse", [{version, 2}]).
Intersection = sets:intersection(Set1, Set2).
Intersection =:= Set1. %% 该版本下会返回true

这个版本的底层存储是Map,而Erlang中Map的=:=判断会校验键值对的逻辑等价,因此结构相同的Map会返回true。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:51:02