Clojure将序列与向量进行比较

时间:2016-01-10 00:15:24

标签: vector clojure comparison sequence

http://www.4clojure.com/problem/23:“编写一个反转序列的函数”

一个解决方案是(fn [x] (reduce conj () x)),它通过了所有测试。但是,我很好奇为什么该解决方案适用于第一次测试:

(= (__ [1 2 3 4 5]) [5 4 3 2 1])

在REPL中将函数内联计算为true

(= ((fn [x] (reduce conj () x)) [1 2 3 4 5]) [5 4 3 2 1])
true

但是,如果我评估=的第一个参数,我会得到(5 4 3 2 1)(= (5 4 3 2 1) [5 4 3 2 1])会抛出ClassCastException

为什么前者工作而后者不工作?看起来它们应该是等价的......

2 个答案:

答案 0 :(得分:2)

问题是您的列表文字(5 4 3 2 1)正在被评估为函数调用。要正确使用它,您需要引用它,如下所示:

(= '(5 4 3 2 1) [5 4 3 2 1]) ;; => true

答案 1 :(得分:1)

另一种不减少的方法是使用into () 因为它可以作为你的减少而工作。所以当你用这种方式填空时,它就解决了这个任务:

(= (into () [1 2 3 4 5]) [5 4 3 2 1]) ;; true
(= (into () (sorted-set 5 7 2 7)) '(7 5 2)) ;; true
(= (into () [[1 2][3 4][5 6]]) [[5 6][3 4][1 2]]) ;; true