What is the difference between the functions seq?, sequential? and coll?

后端 未结 2 573
时光说笑
时光说笑 2021-01-03 19:49

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

相关标签:
2条回答
  • 2021-01-03 20:09
    • 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.

    0 讨论(0)
  • 2021-01-03 20:14

    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
    
    0 讨论(0)
提交回复
热议问题