请在2024 Clojure状态调查!分享您的想法。

欢迎!请访问关于页面以了解有关如何操作的更多信息。

0
错误
重新标记

嗨,当我尝试比较某些向量时,我得到了上述的错误信息。我尝试了Clojure 1.10.3和babashka v1.0.168。
以下是一些有问题向量

(compare [[1] [2 3 4]], [[1] 4])
 ;=> Execution error (ClassCastException) at user/eval1 (REPL:1). 
 ;class java.lang.Long cannot be cast to class clojure.lang.IPersistentVector (java.lang.Long is in module java.base of loader 'bootstrap'; clojure.lang.IPersistentVector is in unnamed module of loader 'app')

(compare [[[1 4 []] [6 2] 6 7 6] [[[10 4]] [10] [[3 5 1 9] 3 1 [7 5] 8] 2] [1 [2 [0 3] [2 10 2] 2] [[2 9 7 8 0] [6 0] 10] 9] [[[8 5 8 3]] 2 [2 3 [7 8]]] [0]]
         [[[[3] 4 4] 10 5 2 []] [7 8] [7 7 [[]]] [] [[[4 10 6 7]] [9] [] 3]])

这是缺陷吗,还是我完全看不清为什么这是 显然的 预期行为?

我是在昨天做 Advent of Code 编程练习题时遇到这个问题。题目要求比较多个向量,请见https://adventofcode.com/2022/day/13

我通过实现自己的向量比较器完成了这个练习,根据练习中给出的规格。我上传了源代码,以防你想测试:https://github.com/eNotchy/Advent-of-Code-2022/tree/main/Day13

1 答案

+1

选中
 
最佳答案

向量的比较将会比较每个索引的元素。对于你的例子,第二个元素是一个数字和一个向量。默认的比较器(就是compare函数)不是一个通用的比较器 - 数字和向量之间没有定义的比较方式。所以当你试图比较它们的时候会抛出一个ClassCastException。

你可以使用像sortsort-by这样的函数,它们也接受自定义比较器。更多关于比较器的信息在这里:https://clojure.org/guides/comparators

谢谢,这回答了我的问题。

任何通过搜索引擎找到这个帖子的用户都可以自由地使用我写的用于更多异构向量的自定义比较器,尽管他们可能需要修改它使其能够与除了Longs之外的其他原始类型一起使用。
https://github.com/eNotchy/Advent-of-Code-2022/blob/main/Day13/2.clj
...