为什么clojure中的矢量没有实现dissoc?

djh*_*987 6 clojure

我知道clojure的clojure.lang.IPersistentVector工具assoc,就像在(assoc [0 1 2 3] 0 -1) ; => [-1 1 2 3].我也听过(如在这个答案中)clojure的向量没有实现dissoc,如在(dissoc [0 1 2 3] 0) ; => [1 2 3].如果使用这个功能很容易重现subvec,是否有任何真正的理由不应该在clojure.lang,clojure.core甚至是contrib中实现它?如果没有,那背后有什么理由吗?

mik*_*era 9

由于两个原因,Dissoc对向量没有多大意义:

  1. 意思dissoc是"删除一把钥匙".您无法从矢量中移除键而不会导致其他副作用(例如,移动所有未来值)
  2. dissoc如果它必须移动所有后续键 - 大约O(n)与相当多的GC,将对矢量执行相对较差.Clojure核心通常避免实现对特定数据结构无效/无意义的操作.

基本上,如果您发现自己想要对dissoc矢量执行操作,则可能使用了错误的数据结构.持久性hashmap或set可能是更好的选择.

如果你想要一个数据结构作为向量,但支持有效地剪切和插入元素或子序列,那么值得检查RRB树:https://github.com/clojure/core.rrb-vector