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

2024-03-25

我听说它被称为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(使用前将#替换为@)

以下函数式编程模式的正确术语是什么? 的相关文章

  • Scala 相当于 F# 中的 |> 或 Clojure 中的 ->>

    在 Scala 中 当我有这个表达式时 f1 f2 f3 p 有没有一种方法可以让我使用类似的东西 F p gt f3 gt f2 gt f1 还是 Clojure gt gt p f3 f2 f1 Scala 中没有相当于 F 的管道运算
  • 函数数组的替代方案?

    我正在编写一个应用程序 php 它需要一个很长的列表相似但不同的功能 由一组按键调用 functions do this gt function does this do that gt function does that etc 我选择
  • 在 Scala 中是否有更好的方法来提升 PartialFunction?

    我偶尔会遇到以下模式 我基本上有一个PartialFunction SomeType AnotherType 并希望将其视为Function SomeType Option AnotherType eg def f s SomeType O
  • 如何在 Haskell 中建模类层次结构?

    我是一名 C 开发人员 来自面向对象的世界 我从接口 类和类型层次结构的角度开始思考 由于 Haskell 缺乏面向对象 有时我发现自己陷入困境 无法想出用 Haskell 建模某些问题的方法 如何在 Haskell 中对涉及类层次结构的现
  • PostgreSQL 序列的下一个值?

    我的 Codeigniter 网站使用 PostgreSQL 我正在使用杂货杂货进行添加 编辑和删除操作 在进行编辑或添加时 我想根据内容的 ID 动态重命名上传的文件 我可以使用杂货做到这一点callback after upload功能
  • API、框架和中间件之间有什么区别? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 API 框架和中间件之间有什么区别 本质上 它们都为应用程序提供抽象的低级服务 既然如此 为什么 dot net 被称为框架 而 windows
  • 为什么我不能将 Clojure 的 :^const 与 Java 字节数组一起使用?

    Using lein repl使用 Clojure 1 4 0 我可以定义一个 constJava 字节数组的 但我不能用它做任何事情 user gt def x byte array map byte 0 1 2 3 user x use
  • Clojure gen-class 返回自己的类

    我现在正在使用 Clojure 创建一个类对象 它有一个返回对象本身的方法 用Java编写的 我想要制作的对象是这样的 class Point public double x public double y public Point dou
  • 理解 scala 中参与者的线程性

    有人告诉我 Scala Actors 实际上从来不会同时执行两个操作 这表明 act 或 React 或 receive 方法本质上是同步的 我知道 act 方法中的长操作可能会导致阻塞问题 并且我假设对消息队列的访问必须以某种方式同步 但
  • clojure 的 emacs slime-connect 版本不会查找 $CLASSPATH

    我需要将 clojure 函数与 slime connect 一起使用 我将所有库都放在 CLASSPATH 中 据我了解这个问题 https stackoverflow com questions 3376840 clojure clas
  • 在环形应用程序中捕获异常的惯用方法

    处理环形应用程序中的异常的惯用方法是什么 我想捕获异常并返回 500 页 我怎么做 我在下面的代码中使用了 Mustache 但是它不起作用 def my app try app wrap logger true wrap keyword
  • 不可变数据结构性能

    我不明白作为一个集合的东西怎么可能是不可变的并且仍然具有可接受的性能 根据我在 F Sets 中读到的内容 内部使用红黑树作为其实现 如果每次我们想要向红黑树添加新内容时 我们基本上都必须重新创建它 那么它如何才能具有良好的性能呢 我在这里
  • 截断表后序列不会重置

    我在截断表后使用 SELECT lastval 来获取错误的序列号 当我截断表时 我使用 SELECT lastval 我得到了错误的 ID Use the TRUNCATESQL 命令 对于单个表 语法如下 TRUNCATE TABLE
  • Clojure 函数 - 返回最后一条语句之前计算的值

    我有一些用 Clojure 编写的测试 这是一个简单的例子 defn test1 start server run pvt and expect PVT 0 stop server 我想返回 run pvt and expect 的结果 但
  • java与maven和eclipse中的clojure混合

    我创建了一个示例多语言程序 我有一个用java实现的传感器和一个机器人 以及用clojure实现的AI 我无法正确连接maven src main java clojuretest DistanceSensor java AI clj us
  • scalaz 中的 Store 是什么

    我试图理解Lenses in scalaz 令人惊讶的是没有找到类似的东西cats core 我遇到了所谓的Store这是一个类型别名 type StoreT F A B IndexedStoreT F A A B type Indexed
  • 好的 Clojure 代码示例? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在第一次查看 Clojure 我发现查看 Clojure 核心库的 doc xxx 和 sourc
  • CSS 术语:这些叫什么?

    考虑 p foo bar CSS 中这些语句的正确名称是什么 我见过它们被称为选择器 规则或规则集 但哪个是正确的 将考虑一条规则 p 本例中的选择器是 p 规则由选择器和声明组成 声明是property value所以整个规则是 sele
  • F# 中序列的递归函数

    这是一个相当微不足道的问题 但快速的谷歌搜索并没有给我答案 为序列编写递归函数的标准方法是什么 对于列表 您可以使用空列表和头 尾模式进行模式匹配 序列的等效项是什么 没有标准的方法可以做到这一点 因为您很少为序列编写递归函数 您应该查看各
  • 线程/进程/任务之间有什么区别?

    线程 进程 任务之间有什么区别 Process 进程是正在执行的计算机程序的实例 它包含程序代码及其当前活动 根据操作系统 OS 进程可能由同时执行指令的多个执行线程组成 基于进程的多任务处理使您能够在使用文本编辑器的同时运行 Java 编

随机推荐