Functional programming 以下函数式编程模式的正确术语是什么?

Functional programming 以下函数式编程模式的正确术语是什么?,functional-programming,clojure,lisp,terminology,sequence,Functional Programming,Clojure,Lisp,Terminology,Sequence,我听说它被称为,有时甚至被称为 以下模式的正确术语是什么?(所示为Clojure代码) 简短回答:streambuilder返回一个函数,该函数返回一个无限序列/列表,该序列/列表必须“延迟”计算(因为您不能在有限时间内计算无限长的内容)。在Clojure世界中,您可能不应该将示例中的任何内容称为“流”,以避免与另一个概念混淆 详细回答: 编程语言思维多样性的一个不幸的副作用是,我们经常使用相同的词来表达不同的意思。您提到的所有三个词(“流”、“无限列表”、“惰性序列”)都是以串行方式指代处理元

我听说它被称为,有时甚至被称为

以下模式的正确术语是什么?(所示为Clojure代码)


简短回答:
streambuilder
返回一个函数,该函数返回一个无限序列/列表,该序列/列表必须“延迟”计算(因为您不能在有限时间内计算无限长的内容)。在Clojure世界中,您可能不应该将示例中的任何内容称为“流”,以避免与另一个概念混淆

详细回答:

编程语言思维多样性的一个不幸的副作用是,我们经常使用相同的词来表达不同的意思。您提到的所有三个词(“流”、“无限列表”、“惰性序列”)都是以串行方式指代处理元素,在Clojure中我们称之为“序列”。然而,每个词所隐含的细微差别略有不同

“流”通常指某些元素序列,现在常用于有限字符序列的上下文中。这些字符序列通常来自文件、网络源或Unix管道

如果一个序列的定义方式是它有无限多的元素,我们可以称之为无限序列。通常无限序列在内部表示为,所以我们可以称之为“无限列表”。不过,老实说,我更喜欢听“无限序列”这个词“在Clojure社区中,因此我们不受特定实现的限制

最后,Clojure中“惰性序列”的细微差别是指“按需”对数据结构进行顺序评估的模式。换句话说,这里强调的是评估的惰性;序列中某个特定元素的值在您请求之前不会实际计算

总之,在Clojure中,您应该使用以下词语:

  • “列表”指具有链表实现的内容
  • “懒惰”指按需评估的事物
  • “无限”指的是大小不是有限的序列(因此必须是惰性的)
  • “流”指来自外部源的管道状(字符)序列

这不是对您问题的回答,但为了编写“漂亮”的clojure代码,我想用您的示例指出一些事情

函数样式的好处之一是能够将函数组合在一起。但是如果你看一看你写的函数,如果不依赖其他地方提供的功能,它们单独做不了什么

例如,
streambuilder
只返回两个元素的
n
列表和一个匿名函数来处理伪递归

我的猜测是,您试图使用惰性序列,但这样做需要支持函数知道实现下一个元素的实现细节,即
stream
second$
。谢天谢地,您可以按如下方式完成:

(defn stream-builder [f x] ; f is idiomatic for a function arg (lazy-seq ; n is idiomatic for a count, so use x instead (cons x (stream-builder f (f x))))) 以上内容将延迟返回
coll
n
元素:

user=> (limit 5 (stream-builder inc 1)) (1 2 3 4 5) 为了将来参考,我们刚刚编写的内容在核心库中分别以
iterate
take
的形式提供:

user=> (take 5 (iterate inc 1)) (1 2 3 4 5) user=>(取5(迭代inc1)) (1 2 3 4 5)
我不知道你在问什么。看起来你已经找到了3个名字。在你看来,有什么比这些同义词更“正确”的答案呢? user=> (limit 5 (stream-builder inc 1)) (1 2 3 4 5) (def odds (limit 23 (stream-builder #(+ 2 %) 1))) user=> (take 5 (iterate inc 1)) (1 2 3 4 5)