What is the difference between the functions seq?, sequential? and coll?
seq函数之间有什么区别?顺序的?和coll?
我发现一些信息散布在整个Internet上,但是我认为最好在此处集中这些信息。
- brainonfire.net/files/seqs-and-colls/main.html
seq?是一个谓词,如果其参数实现ISeq接口,则返回true,也就是说,它提供了方法first,rest,cons。参见http://clojure.org/sequences。
1 2 3 4
| (seq? [1 2])
false
(seq? (seq [1 2]))
true |
sequential?是一个谓词,如果其参数实现Sequential接口,则返回true。 Sequential是标记接口(无方法),并且保证可以按照定义的顺序(例如列表,但不能映射)迭代集合。
1 2 3 4
| (sequential? [])
true
(sequential? {})
false |
coll?是如果其参数包含IPersistentCollection,则返回true的谓词。因此,例如clojure数据结构将返回true,而本机java数据结构将不会:
1 2 3 4
| (coll? {:a 1})
true
(coll? (java.util.HashMap.))
false |
- 向量提供first,rest和cons,但不是seq?吗?
- @FeifanZ,这些(first,rest,cons)函数首先为其参数调用seq函数。因此,如果将这些函数用于不实现ISeq接口的向量(clojure.lang.PersistentVector)(seq?函数返回false),则意味着您将这些函数用于实现ISeq接口的向量(clojure.lang.PersistentVector$ChunkedSeq)(seq ?返回true)。
- seq?对于任何序列为true。
- sequential?对于任何顺序(非关联)集合为true。
- coll?对于任何Clojure集合为true。 。
seq?暗示sequential?暗示coll?
1 2 3
| => ((juxt seq? sequential? coll?) ()) ; [true true true]
=> ((juxt seq? sequential? coll?) []) ; [false true true]
=> ((juxt seq? sequential? coll?) #{}); [false false true] |
不准确:sequential?纯粹是按照惯例与其他人有关-请参见Kevin \\'s answer 。