我正在 clojure 中实现一个有序集,在其中我根据它们的等级检索元素。这意味着我可以在对数时间内检索第 4 个元素(根据集合的顺序)、第 3 个或第 7 个元素。
为了使我的新数据结构与 clojure 的常用方法(或“抽象”)集成,例如conj
, get
,nth
等,这是更好的方法:
- 实际实现
conj
,例如,在我的数据类型的协议中,或者 - 实现 Rich Hickey
clojure.lang.IPersistentSet
或类似的接口。
第一个似乎更容易,但也更容易弄乱函数的语义。第二个似乎我正在实现一个从未打算成为公共 API 一部分的接口,并且与该接口(协议)相关联的实际方法令人困惑地不同。例如,似乎为了conj
用我的集合实现,我必须实现一个具有不同名称的cons
方法。clojure.lang.IPersistentSet
似乎几乎没有关于这一切如何工作的文档,这对实施这个排名集提出了很大的挑战。
我应该选择哪一个?我应该实现自己的方法还是clojure.lang
接口的方法?如果我应该做后者,哪里有一些好的文档可以指导我完成整个过程?
编辑:我想明确表示我正在尝试创建一个集合,您可以通过指定元素的等级(例如,“给我第 5 个元素,先生。放。”)。据我所知,clojure 中还没有这样的集合。