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
by
选择了 by
 
最佳答案

比较向量会将每个索引处的元素进行比较。对于你的示例,第二个元素是数字和向量。默认比较器(这是 compare 函数)不是一个通用比较器——没有定义数字和向量之间的比较。因此,当你尝试比较它们时,将会得到一个 ClassCastException。

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

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

任何通过搜索引擎找到此线程的人都可以自由使用我写的用于更异构向量的自定义比较器,尽管他们可能想修改它以与其他原始类型(不仅限于 Longs)一起使用。
https://github.com/eNotchy/Advent-of-Code-2022/blob/main/Day13/2.clj
...