我听说它被称为http://mitpress.mit.edu/sicp/full-text/sicp/book/node72.html,http://en.wikibooks.org/wiki/Clojure_Programming/Concepts#List_Comprehension,有时甚至是https://stackoverflow.com/questions/1587412/lazy-infinite-sequences-in-clojure-and-python。
以下模式的正确术语是什么?(所示的code代码)
(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)发布于 2010-08-16 13:04:52
简单回答:stream-builder返回一个返回无限序列/列表的函数,该函数必须被计算为“懒惰”(因为不能在有限的时间内计算无限长的值)。在Clojure世界中,您可能不应该将示例中的任何东西称为“流”,以避免与另一个概念混淆。
较长的答覆:
编程语言中思维多样性的一个不幸的副作用是,我们经常使用相同的词来表达不同的含义。你提到的所有三个词(“流”、“无限列表”、“懒惰序列”)都是以串行方式表示处理元素,在Clojure中我们称之为“序列”,然而,每一个词所隐含的细微差别都略有不同。
“流”一般是指某种元素序列,目前常用于有限字符序列的上下文中。这些字符序列通常来自文件、网络源或Unix管道。
如果定义一个序列的方式是有无限个元素,我们可以称它为无限序列。通常无限序列在内部被表示为一个链表,所以我们可以称之为“无限列表”。不过,老实说,我更希望在Clojure社区中听到“无限序列”这个术语,这样我们就不会被特定的实现所束缚。
最后,Clojure中的“懒散序列”的细微差别是指对“按需”的数据结构进行顺序计算的模式。换句话说,这里的重点是评估的惰性性质;序列中某个特定元素的值直到您请求它才会实际计算出来。
总之,在Clojure中,您应该使用以下几个词:
https://stackoverflow.com/questions/3493047
复制相似问题