[英]Clojure compare sequence to vector
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
。
為什么前者有效而后者無效呢? 看起來它們應該是等價的......
問題是您的列表文字(5 4 3 2 1)
正在被評估為函數調用。 要正確使用它,您需要引用它,如下所示:
(= '(5 4 3 2 1) [5 4 3 2 1]) ;; => true
另一種沒有減少的方法就是使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.