反转clojure中的向量(noob)

时间:2013-11-17 12:45:14

标签: clojure

嗨,我刚开始使用Clojure,我无法设法反转整数向量。

;generate a vector of random integers
(defn generate-rands
  [x]
  (vector (take x (repeatedly #(rand-int 100))))
  )

;vector of integers
(def my-vector (generate-rands 10))

;reverse the vector of integers
(def my-vector-reversed (reverse my-vector))

;main
(defn main-app
  []  
  (println "My Vector: \t\t\t" my-vector)
  (println "My Vector Reversed: \t" my-vector-reversed))

输出

=> (main-app)
My Vector:           [(14 49 29 3 66 7 60 60 34 19)]
My Vector Reversed:  [((14 49 29 3 66 7 60 60 34 19))]
nil
#'startingclojure.app/main-app

=> (vector? my-vector-reversed)
false

有人可以向我解释为什么my-vector-reversed不是矢量吗?我怎样才能扭转我的矢量'?的内容? 感谢

3 个答案:

答案 0 :(得分:7)

此外,当您使用rseqreverse时,最好使用vector代替sorted-map。它具有恒定的时间,因为它们被索引并且可以有效地向任一方向行走。

答案 1 :(得分:4)

来自reverse's doc

  

以相反的顺序返回coll中的seq项。不是懒惰。

反转将任何东西变成seq,意思是列表。为了找回一个向量,你应该把它变成一个向量:

(into [] (reverse [1 2 3 4])) ; =>[4 3 2 1]

在你的情况下,看看你的“我的向量”:[(14 49 29 3 66 7 60 60 34 19)] - 它是一个包含单个元素的向量 - 一个seq。所以扭转它不会改变任何事情。你应该使用相同的技术将你的seq变成一个向量:

(defn generate-rands
  [x]
  (into [] (take x (repeatedly #(rand-int 100)))))

答案 2 :(得分:0)

reverse函数始终返回seq,而不是向量。您可以再次将结果转换为具有以下内容的向量:(apply vector (reverse [1 2 3]))