我在Clojure学习sequence
和nil
的概念。这是一个小实验的结果。在Clojure中是一个空列表,是一个无限的空值序列吗?
1:6 user=> (first '())
nil
1:7 user=> (rest '())
()
1:8 user=> (first (rest '()))
nil
这是否意味着“()实际上是尼尔斯的序列?
我在Clojure学习sequence
和nil
的概念。这是一个小实验的结果。在Clojure中是一个空列表,是一个无限的空值序列吗?
1:6 user=> (first '())
nil
1:7 user=> (rest '())
()
1:8 user=> (first (rest '()))
nil
这是否意味着“()实际上是尼尔斯的序列?
如果要测试集合的“其余”是否为空,请使用next
。
user> (next '(foo bar))
(bar)
user> (next '())
nil
user> (doc next)
-------------------------
clojure.core/next
([coll])
Returns a seq of the items after the first. Calls seq on its
argument. If there are no more items, returns nil.
“未缴双关语”(治疗空集合/序列和nil
为同样的事情)去年辗转赞成完全懒序列。有关导致此更改的讨论,请参阅here。
还学习Clojure。
对于空的sequences,rest
返回seq
返回nil
的顺序。
这就是为什么你会得到这种行为。
我认为这是简化的序列进行递归,直到它们是空的,而且很可能其他聪明的家伙原因...
first
和rest
是适用于逻辑结构(seq
)的功能,而不是链接一个列表的结构(如在其他语言中)。
Clojure根据序列(seqs)定义了许多算法。 seq是一个逻辑列表,并且不同于大多数Lisp,其中列表由具体的2插槽结构表示,Clojure使用ISeq接口允许许多数据结构提供对其元素作为序列的访问。
的行为是所述函数的定义,而不是由数据的原始结构确定的结果。
从技术上说是虽然没有一个有用的方式。
“通过调用创建的序列(seq'())是否具有无限数量的空值?”
答案是肯定的becase的的(其余的)空序列是坎空序列它的自我可以有一个(休息)
这种输出的方式误导:
1:7 user=> (rest '()) ()
第一个'()在这里是空列表。
secong()在这里是空序列。
序列与repl中的列表一样打印,即使它们不相同。
没有 - 空列表是不一样的尼尔斯
这是比较容易证明的无限序列。假设我们有:
(def infinite-nils (repeat nil)) ; an infinite lazy sequence of nils
(def empty-list '()) ; an empty list
他们有不同数量的元素:
(count infinite-nils) => doesn't terminate
(count empty-list) => 0
以从中:
(take 10 infinite-nils) => (nil nil nil nil nil nil nil nil nil nil)
(take 10 empty-list) =>()
如果你调用序列上他们,你得到
(seq inifinite-nils) => sequence of infinite nils
(seq empty-list) => nil
在原来的混乱可以largel Ÿ通过了解以下事实来解决:
当我编写cond子句重复序列时,我的第一个检查通常是(空?obj)。这是在Clojure中重现的正确方法吗? – unj2 2009-07-24 01:54:24