gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:34:04 25 4
gpt4 key购买 nike

我听说它被称为 stream , 作为 infinite list , 有时甚至作为 lazy sequence .

以下模式的正确术语是什么? (显示 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 世界中,您可能不应将示例中的所有内容都称为“流”,以免与另一个概念混淆。

更长的答案:

编程语言中思想多样性的一个不幸的副作用是我们经常使用相同的词来表示不同的含义。您提到的所有三个词(“Stream”、infinite list、“lazy sequence”)都是指以串行方式处理元素,在 Clojure 中我们称这些为“序列”。但是,每个词所暗示的细微差别略有不同。

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

如果一个序列被定义为它有无限个元素,我们可以称它为无限序列。通常无限序列在内部表示为 linked list ,所以我们可以称这些为“无限列表”。虽然,老实说,我更愿意在 Clojure 社区中听到“无限序列”这个术语,这样我们就不会被特定的实现所束缚。

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

总而言之,在 Clojure 中你应该使用这些词:

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

关于functional-programming - 以下函数式编程模式的正确术语是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3493047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com