What is the difference between the functions seq? sequential? and coll?
I found some information scattered throughout the internet, but I think it would be better to
seq?
is true for any sequence.sequential?
is true for any sequential (not associative)
collection.coll?
is true for any Clojure collection.seq?
implies sequential?
implies coll?
=> ((juxt seq? sequential? coll?) ()) ; [true true true]
=> ((juxt seq? sequential? coll?) []) ; [false true true]
=> ((juxt seq? sequential? coll?) #{}); [false false true]
Inaccurate: sequential?
is related to the others purely by convention - see Kevin's answer.
seq?
is a predicate that returns true if it's argument implements ISeq
interface, which is to say it provides the methods first
,rest
,cons
. See http://clojure.org/sequences.
(seq? [1 2])
false
(seq? (seq [1 2]))
true
sequential?
is a predicate that returns true if it's argument implements Sequential
interface. Sequential
is a marker interface (no methods) and is a promise that the collection can be iterated over in a defined order (e.g. a list, but not a map).
(sequential? [])
true
(sequential? {})
false
coll?
is a predicate that returns true if its argument implments IPersistentCollection
. So for example the clojure data structures would return true, whereas native java data structures would not:
(coll? {:a 1})
true
(coll? (java.util.HashMap.))
false