【问题标题】:Why I'm getting a list instead of a vector?为什么我得到一个列表而不是一个向量?
【发布时间】:2014-11-26 04:38:44
【问题描述】:
所以,我试图以这种方式转换向量 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
【问题讨论】:
标签:
vector
clojure
functional-programming
lisp
【解决方案1】:
你提供的函数代码没有使用本地匿名函数,可以大大重构。
这是您使用 cmets 的原始函数。
(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]
【解决方案2】:
您的代码的作用
您的原始代码(重新格式化)
(defn change [x]
(fn [i] (assoc x i (- 1 (/ 1 (get x i)))))
(range 0 (* (count x) 1)))
所以你可以省略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)