Clojure 阴影图';s';获取';功能

Clojure 阴影图';s';获取';功能,clojure,Clojure,我正试图用一些我喜欢的集合论和格论概念,提出一种数据结构,用于探索标有关键术语的数据,如“系统论”或“互联网”。我想也许我可以扩展散列映射的工作方式。我为我想要的行为写了一些测试,然后我意识到我真的不知道如何使用类型和协议来工作 这是我的想法。我想按字符串集对数据集合进行索引。例如: (def data { #{"systems theory" "internet"} [1 2 3] #{"systems theory" "biology"} [4 5] #{"systems theor

我正试图用一些我喜欢的集合论和格论概念,提出一种数据结构,用于探索标有关键术语的数据,如“系统论”或“互联网”。我想也许我可以扩展散列映射的工作方式。我为我想要的行为写了一些测试,然后我意识到我真的不知道如何使用类型和协议来工作

这是我的想法。我想按字符串集对数据集合进行索引。例如:

(def data { #{"systems theory" "internet"} [1 2 3]
  #{"systems theory" "biology"} [4 5]
  #{"systems theory"} [6 7 8] })
我免费得到

(data #{"systems theory"})
;=> [6 7 8]
这很好

但是,能够做这样的事情也很容易

(data "biology")
;=> { #{"systems theory"} [4 5] }
当我想到这一点时,我想告诉PersistentHashMap的
get
方法正常工作并不困难,除非它被要求使用字符串作为键,在这种情况下,执行任何必要的操作以获得新的数据结构。但是当我写代码的时候,我只是一团糟,实际上我不知道如何设计这个东西


我有Fogus的《Clojure的乐趣》的副本,我将阅读关于类型和协议以及扩展类型之类的内容,看看我是否能够理解如何以及在何处定义和更改内置函数。但我也希望得到一个提示

您所描述的可能是可能的,但我认为您最好只编写一个函数来过滤列表中包含搜索词的任何集合


也可以考虑使用的访问模式,我怀疑字符串是键,而集合中的文档ID可能更高效和更灵活。p> 我不会创建新的专用映射实现,而是从原始数据创建一个简单的索引映射:

(def data {#{"systems theory" "internet"} [1 2 3]
           #{"systems theory" "biology"} [4 5]
           #{"systems theory"} [6 7 8] })

(def cats (->> data
               (map (fn [[cats val]]
                      (->> cats
                           (map (juxt identity #(hash-map (disj cats %) val)))
                           (into {}))))
               (apply merge)))

(get cats "internet")
;=> {#{"systems theory"} [1 2 3]}

(get cats "biology")
;=> {#{"systems theory"} [4 5]}

(get cats "systems theory")
;=> {#{"biology"} [4 5]}
如果您想:

(def full-index (merge data cats))

(get full-index "internet") ;=> {#{"systems theory"} [1 2 3]}
(get full-index #{"systems theory"}) ;=> [6 7 8]
如果仍要创建专用映射实现,可能需要了解以下内容:

  • :“一个 Clojure分类集合的实现(用Clojure编写)。 例如,请参见 它用于实现
    排序映射

  • :“持久排序 具有日志时间排名查询的映射和集“

  • : “优先级映射与排序映射非常相似,但排序映射 映射生成按键排序的条目序列,即优先级映射 生成按值排序的条目。“。也许代码更容易理解 比其他人更了解


如果您想保留哈希映射的语义,这并不容易(例如
count
应该返回原始映射计数加上新键计数的总和)。您可能需要使用来测试您的实现。

我认为“这不是正确的方法”是正确的答案。我想围绕“集合”和“元素”的概念而不是“集合”和“java.lang.String”来定义函数,所以摆弄
get
是错误抽象级别的逻辑。收集检查是一个很好的建议。我正在尝试测试驱动,这看起来是一种避免在创建新数据结构时丢失功能的方法。