我听说它被称为stream http://mitpress.mit.edu/sicp/full-text/sicp/book/node72.html, as an 无限列表 http://en.wikibooks.org/wiki/Clojure_Programming/Concepts#List_Comprehension,有时甚至作为惰性序列 https://stackoverflow.com/questions/1587412/lazy-infinite-sequences-in-clojure-and-python.
以下模式的正确术语是什么? (所示为 Clojure 代码)
(def first$ first)
(defn second$ [str]
(cond
(empty? str) ()
true ((first (rest str)))))
(defn stream-builder [next_ n]
(cons n (cons (fn [] (stream-builder next_ (next_ n))) ())))
(defn stream [str n]
(cond
(= 0 n) ()
true (cons (first$ str) (stream (second$ str) (- n 1)))))
(def odd
(stream-builder (fn [n]
(+ 2 n))1))
(println (stream odd 23))
> (1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45)
简短回答:stream-builder
返回一个返回无限序列/列表的函数,必须“惰性”地对其进行评估(因为您无法在有限时间内评估无限长的东西)。在 Clojure 世界中,您可能不应该将示例中的任何内容称为“流”,以避免与另一个概念混淆。
更长的答案:
编程语言中思想多样性的一个不幸的副作用是我们经常使用相同的单词来表示不同的含义。您提到的所有三个词(“流”、“无限列表”、“惰性序列”)均指以串行方式处理元素,在 Clojure 中我们将这些称为“序列”。但是,每个词隐含的细微差别略有不同。
“流”通常指一些元素序列,并且现在经常在有限字符序列的上下文中使用。这些字符序列通常来自文件、网络源或 Unix 管道。
如果一个序列以具有无限多个元素的方式定义,我们可以将其称为无限序列。通常无限序列在内部表示为链表 http://en.wikipedia.org/wiki/Linked_list,所以我们可以称这些为“无限列表”。不过,说实话,我更愿意在 Clojure 社区中听到“无限序列”这个术语,这样我们就不会受限于特定的实现。
最后,Clojure 中“惰性序列”的细微差别是指“按需”对数据结构进行顺序求值的模式。换句话说,这里的重点是lazy评估的性质;序列中特定元素的值在您要求之前不会被实际计算。
总之,在 Clojure 中你应该使用这些词:
- “list”指的是具有链表实现的东西
- “懒惰”指的是按需评估的事物
- “无限”指的是大小不有限的序列(因此必须是惰性的)
- “流”指来自外部源的类似管道(字符)序列
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)