Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure-映射或设置固定值->;关键功能?_Clojure_Clojureclr - Fatal编程技术网

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

Clojure-映射或设置固定值->;关键功能?,clojure,clojureclr,Clojure,Clojureclr,在我的程序中有很多记录,最后我把它们的一个字段作为键放进了一张地图。比如说 (defrecord Foo. [id afield anotherfield]) 然后我会把它添加到一个以id为键的地图中。这一切都是完全可行的,但有点乏味,例如,当向映射添加一个新的Foo实例时,我需要首先提取密钥。我想知道clojure.core中是否已经存在这样一个数据结构 基本上,我希望通过在集合的构造时为集合的键映射函数(即:id)提供一个值来构造一组Foo,然后在我想要添加/查找/删除/时使用该值。。。价

在我的程序中有很多记录,最后我把它们的一个字段作为键放进了一张地图。比如说

(defrecord Foo. [id afield anotherfield])
然后我会把它添加到一个以id为键的地图中。这一切都是完全可行的,但有点乏味,例如,当向映射添加一个新的Foo实例时,我需要首先提取密钥。我想知道clojure.core中是否已经存在这样一个数据结构

基本上,我希望通过在集合的构造时为集合的键映射函数(即:id)提供一个值来构造一组Foo,然后在我想要添加/查找/删除/时使用该值。。。价值

因此,不是:

(assoc my-map (:id a-foo) a-foo))
我可以说:

(conj my-set a-foo)
更有趣的是,合并和支持合并。

以及(AFAIK)没有这样的数据结构(即使有,它也可能在后台执行相同的繁琐工作),您可以在您的记录fns上构建所需的操作(在后台执行相同的繁琐工作)

基本上我想构造一个集合 通过给集合一个值 键映射功能(即:id)在 施工时间的设置,然后 我想用的时候用吗 添加/查找/删除/

我没收到这个。。如果您将记录保存在一个集合中,然后希望(例如)通过id查找一条记录,则您必须对每条记录进行更为整洁的检查,直到找到正确的记录。。这就是O(n),当使用map时,您将得到O(1)。
我是不是用得太多了?我的建议是用地图做一些无聊的事情。。毕竟都是1和0:)

听起来像是一个简单的例子,你想用一个函数来消除“繁琐”的部分

e、 g

如果您经常这样做,并且需要不同的键函数,您可能希望尝试更高阶的函数:

(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))

最后,请注意,可以对宏执行相同的操作。但是,宏的一条有用的一般规则是,除非您确实需要它们,否则不要使用它们。因此,在这种情况下,由于使用函数可以轻松完成,我建议坚持使用函数。

是的,我使用的是映射。我试图通过使用现成的东西来避免那些可以避免的繁琐的东西。我的观点是,这不是可以避免的,只是为您需要的操作定制一些FN(因为架子上没有)。。而且你无论如何也不应该瞄准set…对-但它看起来像是一个从外面看的集合(带有小字),除了根据键函数检查相等性。他们说真正重要的是里面的内容:)我将高阶助手定义为(defn assoc by[key-fn-map-val](assoc-map(key-fn-val)val))这样,您就可以定义(def assoc by id(comp assoc by:id))。谢谢,这正是我最终要做的。
(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))