【问题标题】:Clojure compare sequence to vectorClojure 将序列与向量进行比较
【发布时间】:2016-01-10 00:15:24
【问题描述】:

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

为什么前者有效而后者无效?看起来它们应该是等价的……

【问题讨论】:

    标签: vector clojure comparison sequence


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      另一种不使用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
      

      【讨论】:

      • 不错!刚开始接触 Clojure,所以我不知道 into
      猜你喜欢
      • 2017-08-05
      • 2021-12-29
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多