反转clojure中的向量(noob)

nuv*_*vio 5 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))
Run Code Online (Sandbox Code Playgroud)

输出是

=> (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
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*son 8

此外,最好使用rseq而不是reverse使用vector或使用sorted-map.它具有恒定的时间,因为它们被索引并且可以在任一方向上有效地行走.


Shl*_*omi 5

反向的文档

以相反的顺序返回coll项目的序列。不偷懒。

反向将任何内容变成一个序列,即一个列表。为了获取向量,您应该将其转换为向量:

(into [] (reverse [1 2 3 4])) ; =>[4 3 2 1]
Run Code Online (Sandbox Code Playgroud)

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

(defn generate-rands
  [x]
  (into [] (take x (repeatedly #(rand-int 100)))))
Run Code Online (Sandbox Code Playgroud)