Подтвердить что ты не робот

В чем разница между функциями seq?, последовательными? и колла?

В чем разница между функциями seq? последовательный? и coll?

Я нашел некоторую информацию, разбросанную по всему Интернету, но я думаю, что было бы лучше централизовать эту информацию здесь.

4b9b3361

Ответ 1

seq? - это предикат, который возвращает true, если аргумент реализует интерфейс ISeq, то есть он предоставляет методы first, rest, cons. См. http://clojure.org/sequences.

(seq? [1 2])
false
(seq? (seq [1 2]))
true

sequential? - предикат, который возвращает true, если аргумент реализует интерфейс Sequential. Sequential является интерфейсом маркера (без методов) и является обещанием, что сбор может быть повторен в определенном порядке (например, список, но не карта).

(sequential? [])
true
(sequential? {})
false

coll? - предикат, который возвращает true, если его аргумент implments IPersistentCollection. Так, например, структуры данных clojure вернули бы true, тогда как собственные структуры данных Java не будут:

(coll? {:a 1})
true
(coll? (java.util.HashMap.))
false

Ответ 2

  • seq? истинно для любой последовательности.
  • sequential? истинно для любого последовательного (не ассоциативного) коллекция.
  • coll? истинно для любой коллекции Clojure.

seq? означает, что sequential? означает coll?

=> ((juxt seq? sequential? coll?) ()) ; [true true true]
=> ((juxt seq? sequential? coll?) []) ; [false true true]
=> ((juxt seq? sequential? coll?) #{}); [false false true]

Неточный: sequential? связан с остальными чисто условными - см. ответ Кевина.