关于clojure:顺序函数seq和有什么区别?和科尔?

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

seq函数之间有什么区别?顺序的?和coll?

我发现一些信息散布在整个Internet上,但是我认为最好在此处集中这些信息。


seq?是一个谓词,如果其参数实现ISeq接口,则返回true,也就是说,它提供了方法firstrestcons。参见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


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