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

不想你离开。 提交于 2019-12-30 05:45:07

问题


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 centralize that information here.


回答1:


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



回答2:


  • 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.



来源:https://stackoverflow.com/questions/22439174/what-is-the-difference-between-the-functions-seq-sequential-and-coll

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!