函数式编程中的可变性

2024-02-04

首先我是 Haskell 新手。 我读过这个:高度可变域中的不可变函数对象 https://stackoverflow.com/questions/166379/immutable-functional-objects-in-highly-mutable-domain我的问题几乎是相同的——如何有效地编写状态应该改变的算法。我们以 Dijkstra 算法为例。将会发现新的路径并且应该更新距离。在传统语言中,这很简单,而在 Haskell 中,例如我只能想到创建全新的距离,这会太慢并且消耗内存。对于这种情况,是否有类似设计模式的东西,应该实现具有可变数据结构的算法,并且速度和内存使用是主要关注点?


当然,函数式语言有很多方法可以解决这个问题。

  1. 不同的数据结构 - 许多数据结构可以在一个中实现纯功能性的方式,具有与命令式版本相同的算法复杂性。该领域最著名的作品可能是 Chris Okasaki 的作品纯函数式数据结构 http://www.eecs.usma.edu/webs/people/okasaki/pubs.html,但还有许多其他资源。对于 Dijkstra 算法,马丁·厄维格 http://web.engr.oregonstate.edu/~erwig/的工作功能图 http://hackage.haskell.org/package/fgl是合适的。看这个问题 https://stackoverflow.com/questions/2999072/how-do-i-implement-graphs-and-graph-algorithms-in-a-functional-programming-langua以及。

  2. 不同的算法 - 有些算法具有内置的可变性假设,快速排序就是一个例子。在这种情况下,可以使用更适合不变性的替代算法。

  3. 可变状态——每种函数式语言都可以使用 State monad 来模拟函数式状态。大多数还提供其他形式的可变性,例如 Haskell 的 ST monad 和 IORef。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数式编程中的可变性 的相关文章

  • 为什么我们需要检测链表中的循环

    我看到很多关于如何检测链表中的循环的问答 但我想了解的是我们为什么要这样做 换句话说 检测链表中的循环的实际用例是什么 在现实生活中 您可能永远不需要检测链表中的循环 但是执行此操作的算法很重要 我在现实生活中多次使用它们 例如 我经常会递
  • SQL 中的链表

    在 MySQL 数据库中存储链接列表的最佳方法是什么 这样插入就很简单 即 您不必每次都重新索引一堆内容 并且可以轻松地按顺序拉出列表 使用 Adrian 的解决方案 但不是增加 1 而是增加 10 甚至 100 然后可以按照要插入的内容之
  • stl 集的 C# 等效项是什么?

    我想使用 C 将一些值存储在平衡二叉搜索树中 我查看了泛型命名空间中的集合 但没有找到与 stl 集合等效的集合 我可以使用什么通用集合 我不想存储键 值对 只是值 你可以使用HashSet http msdn microsoft com
  • 在哪里可以找到有关双三次插值和 Lanczos 重采样的好读物?

    我想用 C 实现上述两种图像重采样算法 双三次和 Lanczos 我知道现有的实现有几十种 但我仍然想制作自己的实现 我之所以这么做 部分原因是我想了解它们是如何工作的 部分原因是我想为它们提供一些主流实现中没有的功能 例如可配置的多 CP
  • 忽略 Racket 中的多个返回值

    在 Racket 中 可以通过执行以下操作从函数返回多个值 define foo values 1 2 3 然后我们可以通过这样做来绑定它们 define values one two three foo Now one一定会1 two t
  • 带有元数据的 scipy kdtree

    我目前正在寻找一种方法来构建几个 kd 树以快速查询一些 n 维数据 但是 我对 scipy KD 树算法有一些问题 我的数据包括id gt data somedata coordinate x y 我希望能够基于坐标和 k 最近邻居的 i
  • 对列表中的相邻元素进行分组

    假设我想编写一个函数来执行此操作 输入 1 1 3 3 4 2 2 5 6 6 输出 1 1 3 3 4 2 2 5 6 6 它将相同的相邻元素分组 这个方法的名称应该是什么 此操作有标准名称吗 In 1 1 3 3 4 2 2 5 6 6
  • 使用 stl sort 对表进行排序

    我有一个巨大的表 约 50Gb 格式为 i j k 来自稀疏矩阵 存储为 uint32 t idx1 idx2 float vals uint32 t tablesize 我想使用给定的比较函数 即 idx1 和 idx2 的函数 对其进行
  • 如何将多个值存储到一个键(java)

    我搜索一个可以存储多个键值对的数据结构 数据基本上是这样的 1 value 1 2 value 2 于是我想到了使用HashMap 遗憾的是 这对我不起作用 因为一个键可能会出现多个值 在上面的例子中 1 value 2 可能是另一个条目
  • 如何只修改记录的一个字段而不完全重写它? [复制]

    这个问题在这里已经有答案了 It s the second time I m tackling this problem And for the second time this is while working with the Stat
  • 你将如何在 Haskell 中(重新)实现迭代?

    iterate a gt a gt a gt a 你可能知道 iterate是一个接受函数和起始值的函数 然后它将函数应用于起始值 然后将相同的函数应用于最后的结果 依此类推 Prelude gt take 5 iterate 2 2 2
  • 如何使用networkx删除有向图中的所有相关节点?

    我不确定我的问题的正确术语是什么 所以我只会解释我想做的事情 我有一个有向图 删除节点后我希望所有独立相关的节点也被删除 这是一个例子 假设我删除节点 11 我希望节点 2 也被删除 在我自己的示例中 它们将是 2 以下的节点 现在也必须删
  • 在Python中寻找坐标系中某些点之间的最短路径

    我编写了一个代码 可以在坐标系中的特定宽度和长度范围内生成所需数量的点 它计算并列出我使用欧几里德方法生成的这些点的距离矩阵 我的代码在这里 import pandas as pd from scipy spatial import dis
  • Python - 在大型数据集上计算多项概率密度函数?

    我原本打算使用 MATLAB 来解决这个问题 但内置函数有局限性 不适合我的目标 NumPy 中也存在同样的限制 我有两个制表符分隔的文件 第一个是显示内部蛋白质结构数据库的氨基酸残基 频率和计数的文件 即 A 0 25 1 S 0 25
  • Haskell / cabal 包的解决方法受到 Nix 和 Cabal 的限制?

    我最近开始开发反射平台 https github com reflex frp reflex platform 有一些额外的配置类似于优秀的反射项目骨架 https github com ElvishJerricco reflex proj
  • 为什么我不能声明推断类型?

    我有以下内容 runcount Eq a Num b gt a gt b runcount runcountacc 0 runcountacc Eq a Num b gt b gt a gt b runcountacc n runcount
  • 递归:n项级数之和

    需要递归函数 系列是 1 2 3 3 4 5 4 5 6 7 递归求 n 的级数之和 我无法想到应该在函数中传递哪些参数 我的方法 我认为我应该传递 n 要相乘的项数 但我无法想到的是我应该如何在同一个函数中 和 以及我的 return 语
  • 查找数组中 2 个缺失数字的最快方法

    这个问题的存在只是出于纯粹的好奇心 不是作业 找到在数组 1 n 中找到两个缺失数字的最快方法 因此 在相关帖子中 查找数字数组中缺失数字的最快方法 https stackoverflow com questions 2113795 qui
  • CSR 矩阵 - 矩阵乘法

    我有两个方阵A and B 我必须转换B to CSR Format并确定产品C A B csr C 我在网上找到了很多关于CSR 矩阵 向量乘法 http www mathcs emory edu cheung Courses 561 S
  • 广度优先搜索:检查访问状态的时机

    在有向图的广度优先搜索中 可能循环 当一个节点出队时 其所有尚未访问的子节点都会入队 并且该过程将继续 直到队列为空 有一次 我以相反的方式实现它 将节点的所有子节点排队 并在节点出队时检查访问状态 如果正在出队的节点之前已被访问过 则该节

随机推荐

  • 在 OSX 上安装了 GNU grep,但无法使用

    我尝试在 OSX 上安装 GNU grep 它似乎已安装 但我无法使用它 我已经使用自制程序完成了此操作 Macports 目前遇到了一些问题 所以我无法使用它 安装 brew tap homebrew dupes brew install
  • tomcat-dbcp 与 commons-dbcp

    这两个连接池库之间似乎存在很多混淆 我想知道哪一个更好 如果有的话 以下是我想提出的一些要点 有人可以验证吗 Tomcat DBCP 使用默认的 tomcat dbcp jar 该jar 将出现在 tomcat lib 目录中 你do no
  • 如何重新启动我自己的qt应用程序?

    我只是问自己如何重新启动我自己的qt应用程序 有人可以给我举个例子吗 要重新启动应用程序 请尝试 include
  • Matplotlib Savefig 不会覆盖旧文件

    这看起来一定是我的机器上的权限问题 在 Windows 10 上进行系统更新后 当我运行 import matplotlib pyplot as plt make figure plt plot 1 2 3 4 plt ylabel som
  • python 处理无尽的 XML

    我正在开发一个应用程序 我的工作只是为该应用程序开发一个示例 Python 接口 应用程序可以提供基于XML的文档 我可以通过HTTP Get方法获取文档 但问题是基于XML的文档是无限的 这意味着不会有结束元素 我知道文件应该由SAX来处
  • 在 JSX 中拥有变量属性的最佳方式是什么?

    希望我的问题很清楚 我主要是在寻找一种将属性动态附加到 JSX 输入的方法
  • Python 人们使用哪个路径模块或类来代替 os.path?

    只是想知道有多少人在 Python 中使用路径模块 例如 Jason Orendorff 的路径模块 而不是使用os path用于连接和分割路径 您是否使用过 Jason 的路径模块 http wiki python org moin Pa
  • 决策树中特定类的 Sklearn 决策规则

    我正在创建决策树 我的数据属于以下类型 X1 X2 X3 X50 Y 1 5 7 0 1 1 5 34 81 0 1 4 21 21 1 0 65 34 23 1 1 我正在尝试执行以下代码 X train data iloc 0 51 Y
  • 无服务器框架中的共享 Lambda 授权方设置

    我正在尝试创建一个自定义 Lambda 授权方 该授权方将在几个不同的服务 无服务器堆栈之间共享 如果我理解这里的文档https serverless com framework docs providers aws events apig
  • 如何将 Excel 中的日期转换为 ISO 8601 格式

    我试图将日期格式保存为 YYYY MM DD 例如 2014 09 01 作为 CSV 文件 但当我这样做时 格式会恢复为 M D YYYY 格式 我尝试在 Excel 中将日期转换为字符串 但每次打开 CSV 文件时 它都会恢复为 M D
  • zip(*[iter(s)]*n) 在 Python 中如何工作?

    s 1 2 3 4 5 6 7 8 9 n 3 list zip iter s n returns 1 2 3 4 5 6 7 8 9 如何zip iter s n 工作 如果用更冗长的代码编写它会是什么样子 This is a techn
  • 是否有可以通过示例创建 XSLT 的 XSL 代码生成器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 给定一个源 XML 文档以及转换后的示例 是否有一个代码生成器可以创建 XSL 转换来完成该转换 我并不
  • async/await 和访问者模式[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我们最近将对象树状结构 大约 40 层深 的访问者之一转换为 async await 模式 因为最里面的接受方法现在执行
  • 如何同时运行两个 python 循环?

    假设我在Python中有以下内容 A loop for i in range 10000 Do Task A B loop for i in range 10000 Do Task B 如何在 Python 中同时运行这些循环 如果你想要并
  • RU/m 去哪儿了?

    这曾经是 CosmosDb 的一项功能 用于提供每分钟请求单位 以及每秒请求单位 但是该选项似乎已从门户中消失 并且所有在线文档均已删除 谢谢 奥利弗 RU m 已死 刚刚收到微软的回复 我们收到了参与预览计划的客户的大量反馈 从 2017
  • 系统中 1 字节!= 8 位? [复制]

    这个问题在这里已经有答案了 我一直读这样的句子 不要依赖 1 个字节就是 8 位大小 use CHAR BIT而不是 8 作为常量在位和字节之间转换 et cetera What real life systems are there to
  • 如何使用 Gradle 在 JAR 中包含单个依赖项?

    我从 Gradle 开始 想知道如何将单个依赖项 在我的例子中为 TeamSpeak API 包含到我的 JAR 中 以便它在运行时可用 这是我的 build gradle 的一部分 apply plugin java compileJav
  • 对于登录应用程序,我将如何检查密码的 sha1 值?

    我将如何添加一个函数来检查数据库中用户 sha1 密码值
  • 如何从编译的二进制文件 (.so) 中删除字符串

    如何从编译的二进制文件中删除字符串 对其进行混淆 目标是避免人们阅读内部函数 方法的名称 它是使用 NDK 工具 包括 GCC 从 Android 的 C 代码编译的动态库 so 我编译用 O3并已经使用arm eabi strip g m
  • 函数式编程中的可变性

    首先我是 Haskell 新手 我读过这个 高度可变域中的不可变函数对象 https stackoverflow com questions 166379 immutable functional objects in highly mut