哪种协议可以扩展为Trie类型?

时间:2016-01-17 05:53:24

标签: types clojure records trie

我正在Clojure中编写一个Trie数据结构的实现,并认为最好使用defrecord创建我自己的类型,它可以重载对集合进行操作的函数。如何确定要扩展的协议的名称,以便我可以为我的新Trie类型实现conj和其他类似的功能?

1 个答案:

答案 0 :(得分:4)

如果要实现新的数据结构,则需要使用deftype而不是defrecord,因为后者会对结果类型执行映射行为的某种实现。

至于clojure.core集合函数,大多数都基于接口而不是协议。 (但是,ClojureScript确实使用了协议。)发现哪些接口可能与新数据结构相关的最简单方法是检查已存在的类似数据结构:

;; all superclasses and interfaces of the class of {}, that is,
;; clojure.lang.PersistentArrayMap
(ancestors (class {}))

;; interfaces only
(filter #(.isInterface %) (ancestors (class {})))

由于你计划实现一个trie,我猜你想要实现一个map或set。如果是这样,data.avl实现了所有相关接口(以及ClojureScript版本中的所有相关协议) - 您可以查看源代码。

相关问题