代码之家  ›  专栏  ›  技术社区  ›  dmh

为Trie类型扩展哪个协议?

  •  2
  • dmh  · 技术社区  · 9 年前

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

    1 回复  |  直到 9 年前
        1
  •  4
  •   Michał Marczyk    9 年前

    如果您想实现一个新的数据结构,您需要使用 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版本中的所有相关协议),您可以查看源代码。