LazySeq не может быть приведен к Comparable при сортировке - PullRequest
0 голосов
/ 19 сентября 2018

clojure 1.9.0

Простой тест sort-by для массива символов работает ниже,

user=> (sort-by identity [[\B] [\a]])
([\B] [\a])

, но почему другой тест не прошел sort-by без учета регистра?

user=> (sort-by (partial map #(Character/toLowerCase %)) [[\B] [\a]])

java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Comparable

Решение

Использование mapv вместо map делает его.

user=> (instance? clojure.lang.LazySeq (map identity []))
true
user=> (instance? clojure.lang.PersistentVector (mapv identity (map identity [])))
true

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

но почему другому тесту не удалось выполнить сортировку без учета регистра?

map возвращает отложенную последовательность, которая не реализует Comparable.mapv работает, потому что векторы поддерживают Comparable, и именно это sort-by использует для сортировки.

(supers (type []))
=> #{... java.lang.Comparable ...}

(supers clojure.lang.LazySeq)
=> #{clojure.lang.IObj clojure.lang.ISeq clojure.lang.Seqable clojure.lang.IMeta java.lang.Iterable java.util.List clojure.lang.IHashEq java.lang.Object clojure.lang.Obj java.util.Collection clojure.lang.IPending clojure.lang.Sequential clojure.lang.IPersistentCollection java.io.Serializable}
0 голосов
/ 19 сентября 2018

Вам не нужна карта:

(ns tst.demo.core
  (:require
    [clojure.string :as str] ))

(sort-by  #(.toLowerCase  (str/join %)) [[\a \b] [\B] [\a]])
;=> ([\a] [\a \b] [\B])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...