【问题标题】:Is there a standard way to compare Clojure vectors in the 'conventional' way是否有一种标准方法可以以“常规”方式比较 Clojure 向量
【发布时间】:2013-03-30 09:17:36
【问题描述】:

Clojure 向量有一个不常见的属性,当您比较它们时,向量的长度会在任何其他属性之前被考虑。在例如哈斯克尔

Prelude> [1, 3] > [1, 2, 3]
True

和红宝石

1.9.3p392 :003 > [1, 3] <=> [1, 2, 3]
 => 1 

但在 Clojure 中:

user=> (compare [1, 3] [1, 2, 3])
-1

现在您可以自己实现“常规”比较:

(defn vector-compare [[value1 & rest1] [value2 & rest2]]
  (let [result (compare value1 value2)]
    (cond 
      (not (= result 0)) result
      (nil? value1) 0 ; value2 will be nil as well 
      :else (recur rest1 rest2))))

但我希望这种比较向量的方式非常普遍,以至于有一种标准方法可以实现这一点。有吗?

【问题讨论】:

    标签: sorting vector clojure


    【解决方案1】:

    compare 函数比较两个事物,如果它们实现了接口 java.lang.Comparable。 Clojure 中的 Vector 实现了这个接口,如this 链接所示,基本上它首先检查长度。没有核心功能可以满足您的需求,因此您必须推出自己的功能。

    我想提到的另一件事是,haskell 版本基本上是比较列表(不是向量),计算列表长度效率不高,在比较列表时避免长度是有意义的,因为向量长度计算为 O(1 ) 操作,因此首先检查长度是有意义的。

    【讨论】:

      【解决方案2】:

      这样的?

      (first (filter (complement zero?) (map compare [1 3] [1 2 3])))
      

      【讨论】:

      • 不幸的是,它不会返回大小不等向量的预期结果,例如[1 2] 和 [1 2 3]。在其他语言(或至少:Haskell 和 Ruby)中,当它们具有相同的前缀时,最长的向量将被认为更大。较短的版本很好,但我主要想知道核心库或标准库中是否存在版本。
      • 当然,但也许在编写自己的函数时,您可以利用我使用的一些核心函数。
      猜你喜欢
      • 1970-01-01
      • 2020-02-24
      • 2010-09-13
      • 2013-01-27
      • 2013-08-31
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多