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 can中的dissoc';我不能上班_Clojure - Fatal编程技术网

clojure can中的dissoc';我不能上班

clojure can中的dissoc';我不能上班,clojure,Clojure,我有这个功能: (defn dissoc-all [m kv] (let [[k & ks] kv] (dissoc m k ks))) 其中,m为地图,kv为按键向量。我是这样使用它的: (dissoc-all {:a 1 :b 2} [:a :b]) =>{:b 2} 这不是我所期望的ks有:b,但我不知道为什么dissoc不使用它。有人能帮我吗 编辑:添加的问题是,为什么这不会触发第三次超负荷的dissoc,即dissoc[map key&ks] 将名称从d

我有这个功能:

(defn dissoc-all [m kv]
  (let [[k & ks] kv]
    (dissoc m k ks)))
其中,
m
为地图,
kv
为按键向量。我是这样使用它的:

(dissoc-all {:a 1 :b 2} [:a :b])

=>{:b 2}
这不是我所期望的
ks
:b
,但我不知道为什么dissoc不使用它。有人能帮我吗

编辑:添加的问题是,为什么这不会触发第三次超负荷的
dissoc
,即
dissoc[map key&ks]


将名称从dissoc in更改为dissoc all,正如noisesmith所说,-in不是该名称的正确名称,我同意。

这不起作用,因为
ks
kv
中第一个之后的所有元素的集合。因此,它不是
:b
,而是
[:b]

相反,您可以只使用apply:

(defn dissoc-in [m vs]
  (apply dissoc m vs))

另外,
dissoc in
是该函数的一个奇怪名称,因为名称中带有
-in
的标准函数都进行嵌套访问,而这不使用键对映射进行任何嵌套访问。

为什么不这样做

(defn dissoc-all [m ks]
  (apply dissoc m ks))

(dissoc-all {:a 1 :b 2} [:a :b])

=> {}
dissoc
的第三个overlod未被调用的原因是它不需要像
[:a:b]
这样的密钥集合-它只需要密钥

例如:

(dissoc {:a "a" :b "b" :c "c" :d "d"} :a :b :c)

=> {:d "d"}
除此之外:

您被
dissoc
的重载/算术弄糊涂了,这些重载/算术具有以下简单的效果:

[m & ks]

"Returns a new map of the same (hashed/sorted) type,
  that does not contain a mapping for any of ks. "
无键和一键的显式算术是为了性能。许多clojure功能都是这样组织的,文档遵循的是组织,而不是基本思想

现在,行动

(dissoc-all {:a 1 :b 2} [:a :b])
;{:b 2}
是绑定

  • k
    :a
  • ks
    [:b]
注意后者。该示例删除了
:a
,但未能删除不存在的
[:b]

您可以使用
apply
打开
ks

(defn dissoc-all [m kk]
  (let [[k & ks] kk]
    (apply dissoc m k ks)))

(dissoc-all {:a 1 :b 2} [:a :b])
;{}

。。。或者,更好的做法是,像@noisesmith那样,立即使用
apply
来缩短分解过程

对不起,您的名字,idk的任何标准:(你的意思是
(:b)
?我还以为它将与
dissoc[map key&ks]
?是的,在该示例中,解构将给你一个包含
:b
的序列,作为
ks
的绑定。由于Clojure的结构等式是如何工作的,因此可以更清楚地指示
[:b]
,而不是
(:b)
,也可以是函数调用。