函数seq ?,顺序有什么区别?和科尔?

时间:2014-03-16 15:59:52

标签: clojure

seq的功能有什么区别?顺序?和柯?

我发现一些信息散布在整个互联网上,但我认为最好将这些信息集中在这里。

2 个答案:

答案 0 :(得分:25)

seq?是一个谓词,如果它的参数实现ISeq接口,则返回true,也就是说它提供方法firstrestcons 。见http://clojure.org/sequences

(seq? [1 2])
false
(seq? (seq [1 2]))
true

sequential?是一个谓词,如果它的参数实现了Sequential接口,则返回true。 Sequential是一个标记接口(没有方法),并且是一个承诺,可以按照定义的顺序(例如列表,但不是地图)迭代集合。

(sequential? [])
true
(sequential? {})
false

coll?是一个谓词,如果其参数包含IPersistentCollection,则返回true。因此,例如,clojure数据结构将返回true,而本机java数据结构将不会:

(coll? {:a 1})
true
(coll? (java.util.HashMap.))
false

答案 1 :(得分:8)

  • seq?适用于任何序列。
  • sequential?适用于任何顺序(非关联) 集合。
  • coll?适用于任何Clojure系列。

seq?暗示sequential?暗示coll?

=> ((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