Каждая коллекция в clojure называется "последовательной", но только список и минусы фактически являются seqs:
user> (seq? {:a 1 :b 2})
false
user> (seq? [1 2 3])
false
Все остальные функции seq сначала конвертируют коллекцию в последовательность и только затем работают на ней.
user> (class (rest {:a 1 :b 2}))
clojure.lang.PersistentArrayMap$Seq
Я не могу делать такие вещи, как:
user> (:b (rest {:a 1 :b 2}))
nil
user> (:b (filter #(-> % val (= 1)) {:a 1 :b 1 :c 2}))
nil
и вынуждены возвращаться к конкретному типу данных. Это выглядит плохой дизайн для меня, но, скорее всего, я пока этого не понимаю.
Итак, почему коллекции clojure не реализуют интерфейс ISeq напрямую, и все функции seq не возвращают объект того же класса, что и входной объект?