gpt4 book ai didi

clojure - assoc-in 可以创建一个新向量而不是新 map 吗?

转载 作者:行者123 更新时间:2023-12-02 16:25:30 24 4
gpt4 key购买 nike

assoc-in 可以更改向量/映射中索引/键的值。在映射中,如果键不存在,则会创建一个新的键/值对。向量是否有类似的东西(如果索引不存在,它会在该索引处创建一个包含该值的列表),例如:

 (reduce (fn [g [x y]] (assoc-in g [x y] y ))
[]
(for [x (range 2)
y (range 2)]
[x y]))

上面的代码生成:

[{1 1, 0 0} {1 1, 0 0}]

我希望它生成:

[[0 1] [0 1]]

这可以通过简单的方式实现吗?

谢谢

编辑:更清楚地说,我只是希望它生成嵌套向量而不是嵌套映射(或映射向量)现在我将 y 作为一个值,但这只是一个示例。

最佳答案

在一般情况下,创建向量而不是 map 效果不佳,因为您只能关联向量中的现有索引或下一个索引:

user=> (assoc [:a] 0 :b) ; works because index 0 exists
[:b]
user=> (assoc [:a] 1 :b) ; works because index 1 is next
[:a :b]
user=> (assoc [:a] 2 :b) ; fails since index is out of range
IndexOutOfBoundsException clojure.lang.PersistentVector.assocN (PersistentVector.java:136)

但是,如果你小心的话,你仍然可以让它发挥作用。以下是 assoc-in 的实现:

(defn assoc-in
[m [k & ks] v]
(if ks
(assoc m k (assoc-in (get m k) ks v))
(assoc m k v)))

请注意,它在 if 条件的 true 分支上调用 get。如果您想要自己的使用向量的 assoc-in 版本,则可以添加一个空向量作为 get 返回的默认值:

(defn vassoc-in
[m [k & ks] v]
(if ks
(assoc m k (vassoc-in (get m k []) ks v))
(assoc m k v)))

在问题的示例代码中使用 vassoc-in 而不是 assoc-in 会导致 [[0 1] [0 1]] 就像你想要的那样。

关于clojure - assoc-in 可以创建一个新向量而不是新 map 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13197897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com