Имейте в виду, что такие вещи, как ISeq - это Java.
В Clojure абстракция seq на самом деле является просто «чем-то», что вы можете предоставить первой, остальной и n-й функциям (обратите внимание, что вы не вызываете сначала в seq, сначала вы вызываете с аргументом seq). Все основные функции языка Clojure работают с коллекциями, последовательностями или примитивными типами. В представленных интерфейсах нет данных, связанных с методами. Таким образом, реализация Clojure осуществляется на Java, и все взаимодействие с JVM будет включать классы / объекты, но сам язык Clojure этого не делает.
Объединение методов со структурами данных - вот что не одобряет Clojure.
Сказав все это ... реальность такова, что функции имеют ограничения на то, с какими аргументами они будут работать. первый отдых и nth будут работать только на то, что может быть последовательным. С этой точки зрения нет большой разницы, связаны ли структуры данных с методами или нет - вы все равно должны правильно их сопоставить. Большие победы происходят от гибкости. Функции могут быть написаны так, чтобы принимать любые аргументы, а затем составляться с функциями более высокого порядка без определения классов и т. Д.
(def farms [{:name "Swansea", :value 100}
{:name "Broadmarsh", :value 200, :produce [:corn :wheat :rye]}
{:name "Snug", :value 50, :animals [:goats :pigs]}])
(reduce + (map :value farms))
-> 350
(reduce + (map :value (filter :animals farms)))
-> 50