Clojure中seq和sequence有什么区别?

8

以下示例产生相同的输出。

(seq [1 2 3 4])
=> (1 2 3 4)

(sequence [1 2 3 4])
=> (1 2 3 4)

4
我认为这个问题已经在文档中得到了解答,可以在这里查看:http://clojuredocs.org/clojure.core/sequence。 - m0skit0
2个回答

7

区别在于,sequence始终返回一个序列,即使集合为空(此时返回一个空列表),而seq对于空集合则返回nil。此外,sequence可以与transducers一起使用。

查看源代码:

user=> (source sequence)
(defn sequence
  "Coerces coll to a (possibly empty) sequence, if it is not already
  one. Will not force a lazy seq. (sequence nil) yields (), ..."
  ([coll]
     (if (seq? coll) coll
         (or (seq coll) ())))
  ...

当只用一个集合调用sequence时,如果该集合尚未是序列,则在该集合上调用seq并返回空列表(如果集合为nil)。


4
首先,它们会以不同的方式处理空序列参数:
user> (seq nil)
nil
user> (seq ())
nil
user> (sequence ())
()
user> (sequence nil)
()

此外,sequence 还有其他操作 transducers 的多个参数。

根据文档:

clojure.core/sequence

[coll]

[xform coll]

[xform coll & colls]

从1.0版本开始添加 如果 coll 不是一个序列(可能为空),则将其强制转换为序列。不会强制执行惰性序列。(sequence nil)产生 ()。当提供一个 transducer 时,返回对 coll(s) 中的项目应用 transform 后的惰性序列,即对每个 coll 的第一个项目集合进行转换,然后对每个 coll 的第二个项目集合进行转换,直到其中任何一个 coll 耗尽。忽略其他 coll 中的任何剩余项目。transform 应接受 number-of-colls 参数。

clojure.core/seq

[coll]

从1.0版本开始添加 返回集合的 seq。如果集合为空,则返回 nil。 (seq nil)返回 nil。seq 还适用于字符串、本机 Java 数组(引用类型)和实现 Iterable 的任何对象。请注意,seq 缓存值,因此不应在其迭代器重复返回相同可变对象的任何 Iterable 上使用 seq。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接