Clojure LazySeq不能按排序方式转换为Compariable
Clojure LazySeq不能按排序方式转换为Compariable,clojure,Clojure,clojure 1.9.0 下面是对字符数组进行排序的简单测试 user=> (sort-by identity [[\B] [\a]]) ([\B] [\a]) 但是为什么另一个测试不敏感地按大小写排序 user=> (sort-by (partial map #(Character/toLowerCase %)) [[\B] [\a]]) java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to
clojure 1.9.0
下面是对字符数组进行排序的简单测试
user=> (sort-by identity [[\B] [\a]])
([\B] [\a])
但是为什么另一个测试不敏感地按
大小写排序
user=> (sort-by (partial map #(Character/toLowerCase %)) [[\B] [\a]])
java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Comparable
解决方案
使用而不是制造它
user=> (instance? clojure.lang.LazySeq (map identity []))
true
user=> (instance? clojure.lang.PersistentVector (mapv identity (map identity [])))
true
您不需要地图:
(ns tst.demo.core
(:require
[clojure.string :as str] ))
(sort-by #(.toLowerCase (str/join %)) [[\a \b] [\B] [\a]])
;=> ([\a] [\a \b] [\B])
但为什么另一个测试没有按案例进行无意识排序呢
user=> (sort-by (partial map #(Character/toLowerCase %)) [[\B] [\a]])
java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Comparable
map
返回一个惰性序列,该序列不实现compariable
mapv
之所以有效,是因为向量支持可比性
,这就是要排序的内容