【问题标题】:How to permanently change a vector in a clojure function with a for loop如何使用 for 循环永久更改 clojure 函数中的向量
【发布时间】:2015-08-12 11:17:38
【问题描述】:

我正在尝试制作一个函数,该函数将获取包含字母的向量并将其转换为具有字母对的向量

["a" "b" "c"] to ["ab" "bc"] 

我发现这个函数可以满足我的需要,但它似乎并没有改变我作为参数输入的向量,而是为每次迭代创建一个新向量。

(defn test [param] (for [i (range (count param))] (assoc param i 
(clojure.string/join [(get param i) (get param (inc i))]))))

有人知道如何永久更改向量的元素吗?

【问题讨论】:

  • Clojure 数据结构、向量、列表等是不可变的。像assoc 这样的函数返回一个新的数据结构,很像旧的数据结构。在底层,它们(在结构上)共享大部分未更改的内容,因此性能损失通常是可以接受的。
  • 好的,有没有办法创建一个只包含字母组合的新向量并使函数返回该值作为结果?
  • 顺便说一句。 clojure 中没有“for 循环”之类的东西,for 是一个列表理解。

标签: for-loop vector clojure


【解决方案1】:

clojure 有许多内置的 fns 来进行这种操作。例如:

(->> ["a" "b" "c" "d"]                                                                                                                                                                                                                                                           
     (partition 2 1)       ; generates (("a" "b") ("b" "c") ("c" "d"))                                                                                                                                                                                                                                                        
     (map clojure.string/join)); joins the pairs
;=> ("ab" "bc" "cd")

如果你真的想要一个向量,请将map 更改为mapv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2016-12-07
    • 2023-02-07
    • 2020-12-21
    • 2014-04-15
    相关资源
    最近更新 更多