2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解有关如何使用本网站的一些更多信息。

0
Clojure
考虑以下代码

(def values [[1 2] [3 4] [5] [6 7] [8]])
(apply max-key count values)
; => [6 7]

它返回的 '*', 最大'条目,是 [6 7]。为什么不是第一个最大条目 [1 2] 呢?
事实上,"max-key" 给不出返回哪个最大值的确切保证。

考虑以下 Scala 中的示例

println(List(List(0, 1, 2), List(2, 3, 4), List(1), List(1, 2, 3)).maxBy(_.length))
> List(0, 1, 2)

在 Scala 中的相同函数返回的是 *第一个* 最大条目(默认情况)。



从 1.4 版本的文件 "clojure/core.clj#4419-4426" 中的代码如下所示
=======================
4419: (defn max-key
4420:  "返回检查函数(k x)最大的x。返回值是number类型。"
4421:  {:added "1.0"
4422:   :static true}
4423:  ([k x] x)
4424:  ([k x y] (if (> (k x) (k y)) x y))
4425:  ([k x y & more]
4426:   (reduce1 #(max-key k %1 %2) (max-key k x y) more)))
=======================

我不确定返回最后候选人的原因是什么,但

我建议以下两点

1. 如果有多个候选人,让 "max-key" 和 "min-key" 返回第一个最大/最小条目。

  这种行为对我来说似乎是更自然/方便的,因为在大多数情况下你想要得到第一个"赢家"。
  (例如,找到一个序列中第一个最大的向量)而你很少需要得到最后一个条目 -- 在这些情况下
   你可以在将序列馈送到 "max-key" 之前进行 "reverse",这似乎使 "返回第一个最大值" 的行为更有用。

  第4424行的符号应该改为 ">="。

2. 确保 "max-key" 和 "min-key" 保证返回顺序,即返回哪个最大/最小条目(第一个或最后一个。

  第4420行应说"返回检查函数(k x)最大的x。当存在多个匹配项时,将返回第一个最大条目"或相同的文档,但说"将返回最后一个最大条目"。

2 个答案

0

评论人:[email protected]

当前行为与文档相符,因此我不会将其视为“缺陷”。似乎没有充分的理由对实现施加一个裁决规则。

0
参考:https://clojure.atlassian.net/browse/CLJ-997(由 alex+import 报告)
...