繁体   English   中英

Clojure - 用固定值 - >键功能映射或设置?

[英]Clojure - map or set with fixed value->key function?

我的程序中有很多记录,我最终使用其中一个字段作为键放入地图。 例如

(defrecord Foo. [id afield anotherfield])

然后我将其添加到id为关键的地图中。 这一切都非常可行,但有点单调乏味,例如在向地图添加新的Foo实例时,我需要先提取密钥。 我想知道clojure.core中的某个地方是否存在已经存在的数据结构?

基本上我想通过在集合的构造时给组映射函数(即:id)设置一个值来构造一组Foo,然后在我想添加/查找/删除/时使用它。 。 一个值。

所以代替:

(assoc my-map (:id a-foo) a-foo))

我能做到,说:

(conj my-set a-foo)

更有趣的是,合并和合并 - 支持。

听起来像一个简单的案例,你想要使用一个函数来消除“乏味”的部分。

例如

(defn my-assoc [some-map some-record]
  (assoc some-map (:id some-record) some-record))

如果您正在执行此操作并需要不同的键功能,则可能需要尝试更高阶的功能:

(defn my-assoc-builder [id-function]
  (fn [some-map some-record] 
    (assoc some-map (id-function some-record) some-record)))

(def my-assoc-by-id (my-assoc-builder :id))

最后,请注意您可以对宏执行相同的操作。 然而,宏的一个有用的一般规则是不使用它们,除非你真的需要它们 因此,在这种情况下,由于可以通过功能轻松完成,我建议坚持使用功能。

那么(AFAIK)就没有这样的数据结构(即使有,它可能会在背景中做同样繁琐的事情),你可以在你的记录fns上建立所需的操作(在后台会做同样繁琐的东西需要要完成)。

基本上我想通过在集合的构造时给组映射函数(即:id)设置一个值来构造一组Foo,然后在我想添加/查找/删除/时使用它。 。

没有得到这个..如果你在一个集合中持有你的记录,然后想要例如通过id找到一个你将不得不做更加整洁的工作查看每个记录,直到你找到正确的...那是O(n ),当使用地图时,你将有O(1)。 我过分使用乏味吗? 我的建议是使用地图并做一些乏味的事情......毕竟这都是1和0 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM