为什么我得到一个列表而不是一个向量?

时间:2014-11-26 04:38:44

标签: vector clojure functional-programming lisp

所以,我试图以这种方式转换向量x的每个元素:x [i] - > 1-(1 / X [I])

(defn change[x]
  (fn [i]
    (assoc x i (- 1 (/ 1 (get x i))))
    )
  (range 0 (* (count x) 1))
  )

我使用assoc来替换向量的每个元素,我应该得到一个包含更改的向量,但我得到一个列表。

例如 使用者名称> (更改[21 32 23 34])

(0 1 2 3)

但我应该得到一个矢量:v

2 个答案:

答案 0 :(得分:3)

您提供的函数的代码不使用本地匿名函数,并且可以进行大量重构。

这是您带注释的原始功能。

(defn change[x]

  ;; start unused anonymous
  (fn [i]
    (assoc x i (- 1 (/ 1 (get x i)))))
  ;; end unused anonymous

  ;; start/end gen list of ints
  (range 0 (* (count x) 1)))

这可能是你的意思

(defn change [coll]
  (mapv #(- 1 (/ 1 %)) coll))

这是输出

user>  (change [21 32 23 34])
;=> [20/21 31/32 22/23 33/34]

答案 1 :(得分:1)

您的代码的作用

您的原始代码(重新格式化)

(defn change [x]
  (fn [i] (assoc x i (- 1 (/ 1 (get x i)))))
  (range 0 (* (count x) 1)))
  • 评估并丢弃函数值,然后
  • 返回range

因此,您可以省略fn表单并将其缩小为

(defn change [x]
  (range 0 (* (count x) 1)))

反过来减少到

(defn change [x]
  (range (count x)))

所以,例如,

(change [:whatever :I :choose :to :put :here])
;(0 1 2 3 4 5)