Clojure 将序列与向量进行比较
Clojure compare sequence to vector
http://www.4clojure.com/problem/23: "Write a function which reverses a sequence"
一种解决方案是(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
。
为什么前者有效而后者无效?看起来它们应该是等价的……
问题是您的列表文字 (5 4 3 2 1)
被评估为函数调用。要正确使用它,您需要引用它,如下所示:
(= '(5 4 3 2 1) [5 4 3 2 1]) ;; => true
另一种不使用 reduce 的方法是使用 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
http://www.4clojure.com/problem/23: "Write a function which reverses a sequence"
一种解决方案是(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
。
为什么前者有效而后者无效?看起来它们应该是等价的……
问题是您的列表文字 (5 4 3 2 1)
被评估为函数调用。要正确使用它,您需要引用它,如下所示:
(= '(5 4 3 2 1) [5 4 3 2 1]) ;; => true
另一种不使用 reduce 的方法是使用 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