Haskell 集合可以保证每个操作的最坏情况范围?

2023-12-26

这种结构对于实时应用程序(例如用户界面)是必要的。 (用户并不关心单击按钮是否需要 0.1 秒或 0.2 秒,但他们确实关心第 100 次单击是否会强制执行出色的惰性计算并需要 10 秒才能继续。)

我在读冈崎的论文纯函数式数据结构 http://www.cs.cmu.edu/~rwh/theses/okasaki.pdf他描述了一种有趣的通用方法,用于将具有摊销界限的惰性数据结构转换为具有相同结构的结构最坏情况的界限every手术。这个想法是分布式计算,以便在每次更新时强制执行未评估的重击的某些部分。

我想知道,是否有这样的标准集合的实现(Map, Set等)在哈斯克尔?

The 容器 http://hackage.haskell.org/package/containers-0.5.0.0包裹说

每个操作的声明成本要么是最坏情况,要么是摊销的,但即使共享结构也仍然有效。

因此无法保证单个操作的最坏情况边界。有严格的变体,例如Data.Map.Strict,但他们对键和值很严格:

键和值参数被评估为 WHNF;键和值在存储到映射之前会被评估为 WHNF。

其结构没有(可能的)严格性。


其结构没有(可能的)严格性。

去寻找来源,例如为了Data.Map.Map http://hackage.haskell.org/packages/archive/containers/0.5.0.0/doc/html/src/Data-Map-Base.html#Map

-- See Note: Order of constructors
data Map k a  = Bin {-# UNPACK #-} !Size !k a !(Map k a) !(Map k a)
              | Tip

你看到一个Map完全是脊椎严格的(并且在琴键上也严格,即使Data.Map.Lazy),如果评估为WHNF,则整个脊柱受力。这同样适用于IntMaps, Sets and IntSets.

因此,您可以通过在每次操作之前强制容器进行 WHNF 来轻松防止构建大型 thunk(映射到/包含的值除外)。对于所包含的值,防止大的重击[时间(和空间)泄漏的常见原因]是自动的Data.XYZ.Strict变体(警告:这些值仅评估为 WHNF,如果您需要更多,您必须自己完成,例如deepseq操作后立即更改值),您需要自己处理Data.XYZ.Lazy变种。

Thus

用户并不关心单击按钮是否需要 0.1 秒或 0.2 秒,但他们关心第 100 次单击是否会强制执行出色的惰性计算并需要 10 秒才能继续。

对于这些容器来说这是一个很容易避免的问题。

然而,第 100 次点击仍然可能需要much处理时间比平均值更长,不是由于出色的惰性计算,而是由于算法(考虑具有两个列表的经典队列实现,前面,您通过以下方式将元素出列)dequeue (Q (x:xs) ys) = (x, Q xs ys)在 O(1) 中,而后面你enqueue y (Q xs ys) = Q xs (y:ys)在 O(1) 中,好吧,除了当前面的列表为空并且需要先反转后面的列表时,出队需要 O(size),但它仍然是 O(1) 摊销)而不改变摊余成本。

不知道用的算法有没有容器 http://hackage.haskell.org/package/containers确实有这样的案例,但需要注意。

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

Haskell 集合可以保证每个操作的最坏情况范围? 的相关文章

  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什
  • 在多线程环境中,Collections.sort 方法有时会抛出 ConcurrentModificationException。列表没有进行结构性修改

    package CollectionsTS import java util ArrayList import java util Collections import java util HashSet import java util
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • FOREACH返回的对象顺序稳定吗?

    是否可以安全地假设对同一集合的两次迭代将以相同的顺序返回对象 显然 假设集合没有被更改 这取决于集合类型 对于大多数集合来说 答案是 是 然而 这并不能得到保证 集合类型的文档应该指定它是否这样做 但正如大多数人所做的那样 该细节通常被忽视
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • 如何在 Java 中获得列表的反向列表视图?

    我想在列表上有一个反向列表视图 与List sublist提供列表上的子列表视图 是否有一些函数可以提供此功能 我不想复制该列表 也不想修改该列表 在这种情况下 如果我能在列表上至少获得一个反向迭代器就足够了 另外 我知道如何自己实现这一点
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • 你能识别 Haskell 程序中的无限列表吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何判断列表是否是无限的 https stackoverflow com questions 7371730 how to tell if a list is infinite 在Haskell中 你
  • 这个对自身单位的列表理解是如何工作的?

    在 haskell IRC 频道中有人问 是否有一种简洁的方法来定义一个列表 其中第 n 个条目是之前所有条目的平方和 我认为这听起来像一个有趣的谜题 递归定义无限列表是我真正需要练习的事情之一 所以我启动了 GHCi 并开始尝试递归定义
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • 用于开始和/或包含搜索的最快字符串集合结构/算法是什么

    我有以下情况 我有一个大的字符串集合 比如说 250 000 平均长度可能是 30 我要做的就是在这些搜索中进行许多搜索 大多数搜索都是 StartsWith 和 Contains 类型的 该集合在运行时是静态的 这意味着选择的集合的初始读
  • Haskell 标准库是什么?

    GHC专用库可以称为标准库吗 或者只有 Haskell 2010 报告中的那些才算数 许多 GHC 库可以通过 Haskell 报告中的函数来实现 可能与 C 绑定相结合 但其他语言依赖于 GHC 特定的扩展 因为语言报告中定义的当前 Ha
  • Data.Sequence 中的 inits 和 tails 如何工作?

    Louis Wasserman 编写了当前的实现inits and tails in Data Sequence 他表示它们非常高效 事实上 只要查看代码 我就可以看到 无论它们在做什么 它们都是以干净 自上而下的方式进行的 这往往会给惰性
  • Haskell:不在范围内:数据构造函数

    今天开始在学校学习 haskell 我遇到了函数问题 我不明白为什么它不在范围内 代码如下 ff Char gt Char gt Char ff A B x 0 y 1 x lt A y lt B x 1 y 0 和错误 md31 hs 2
  • ST monad 是如何工作的?

    我知道 ST monad 有点像 IO 的弟弟 而 IO 又是添加了状态 monadRealWorld魔法 我可以想象状态 也可以想象 RealWorld 以某种方式放入 IO 中 但每次我写一个类型签名ST the sST monad 的
  • 如何打乱列表?

    如何从一组数字 1 2 3 直到我击中x 我的计划是重新调整列表 1 2 3 并把它砍在x chopAt 3 2 3 1 2 3 chopAt 3 2 1 3 2 1 3 chopAt 3 3 1 2 3 chopAt chopAt x y
  • 类型级别集结合律的证明

    我试图证明类型级函数Union https hackage haskell org package type level sets 0 8 5 0 docs Data Type Set html t Union是关联的 但我不确定应该如何完

随机推荐

  • 如何:实体框架和多个模式

    我正在使用实体框架 我使用具有多个模式的单个数据库 mySchema1 EmployeemySchema2 EmployeemySchema3 Employee 当我为此数据库生成 edmx 时 它将表重命名为 Employee1 Empl
  • 如何检测 iPhone 上的声音频率/音调? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试找到一种方法来检测 iPhone 麦克风录制的声音频率 我想检测声音频率是上升还是下降 你可以尝试使用SC监听器 http
  • 在 MiniZinc 中我该如何解决这个错误?

    在 MiniZinc 中 如何编译此代码而不出现错误 未找到具有此签名的函数或谓词 round var float var int D 1 var int F constraint F round D 2 该消息仅意味着 MiniZinc
  • 更改 Drupal 7 中的消息

    drupal 中有几条消息 当出现 php 警告时 会引发错误消息 但模块也可以使用 drupal set message 引发消息 问题是 有没有办法改变这些消息 例如 将每条消息中的每个 a 替换为 b Thanks 虽然设置上没有消息
  • 基于 Java 的正则表达式,允许字母数字字符和 ', and

    我是 Java 中正则表达式的新手 我需要验证字符串是否仅包含字母数字字符 逗号 撇号和句号 句点 其他任何内容都应该等同于错误 有人可以指点一下吗 我现在有这个 我相信字符串中的每个字符都有字母数字 Pattern p Pattern c
  • HTML5 的开放图谱验证

    有没有办法让 facebook 的蹩脚 Open Graph 元标记来验证我的文档类型是否是 HTML5 除了 facebook 的 Open Graph 元标记之外 我的文档验证完美 我真的不想用因为这会带来一系列全新的问题 这是相关验证
  • CMake 在 add_library 的链接阶段末尾添加 -ldl

    我在 github 上编写 维护了一个小型单元测试库https github com acgreek ExtremeCUnit https github com acgreek ExtremeCUnit使用 cmake 构建 您可以在签出后
  • 模拟类型转换对象

    我的 bean 中有一个简单的方法来处理 primefaces 数据表中的单元格编辑事件 方法如下 public void onCellEdit CellEditEvent event Object oldValue event getOl
  • Linq to SQL / 过滤重复项

    我的 sql server 2012 中有一个视图 其中有几个重复项 我想按最新的对它们进行排序并过滤所有其他的 谁能帮助我 我对 SQL Server 2012 的看法 GUID 作为主键 数字 日期时间和名称 guid number d
  • 在 IISExpress 中获取 ASP.Net Core 关闭触发 ApplicationStopping 事件

    我知道之前有一个关于此问题的问题 还有一个 GitHub 问题 https github com aspnet Hosting issues 846 https github com aspnet Hosting issues 846从 M
  • 对于 genericsetup 导入步骤的名称,是否有一个很好的参考列表

    是否有通用设置导入步骤名称的综合参考列表 通用设置导入步骤的名称并不总是与其相应 xml 文件的名称匹配 例如 types xml 有一个名为 typeinfo 的导入步骤 如果没有列表 我会对一种简单的方法来查找导入步骤的名称感到满意 例
  • 学习 Hibernate 的好书或在线资源 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • boost::circular_buffer 相当于文件吗?

    我正在寻找一个允许在磁盘上获取循环缓冲区的库 在 Boost 中也有类似的东西 但它是一个基于内存的容器 循环缓冲区 http www boost org doc libs 1 57 0 doc html circular buffer h
  • 在 Linux 下启动时运行 ASP.NET Core 应用程序

    我想在 Linux 下运行我的 ASP NET Core 解决方案 并在启动时运行结果 来自微软docs https learn microsoft com en us aspnet core host and deploy linux n
  • CustomScrollView 内的 TabView

    用 SliverFillRemaining 包裹 TabBarView 像 Expanded 一样填充剩余的空白空间 会产生以下错误输出 flutter RenderPositionedBox 需要 RenderBox 类型的子代 但收到了
  • 编码为 base64 密钥库文件

    我想对我的 keystore 文件进行编码以在 Gitlab ci 中使用 因此 对于 Base64 编码 我运行以下命令 openssl base64 A in myFile keystore 对于解码 openssl base64 d
  • 如何为 TextView 中的文本更改添加动画效果?

    尝试执行以下操作 animTimeChange AnimationUtils loadAnimation this android R anim slide in left itemTime startAnimation animTimeC
  • 在单个剃刀视图中,如何检索从控制器的不同方法传递的值?

    我正在开发一个基本应用程序 这是主控制器 public ActionResult Index var all context mainz ToList var vm new mainViewModel main lst all return
  • 在 Excel 用户窗体中,如何更新标签的标题?

    我创建了我的第一个无模式UserForm在 Excel 中并在其上放置 ActiveX 标签 如何设置标签的标题 以便它显示其中的内容Sheet1 Range A1 并在单元格 A1 中的值发生变化时自行更新 基本上 我想要Userform
  • Haskell 集合可以保证每个操作的最坏情况范围?

    这种结构对于实时应用程序 例如用户界面 是必要的 用户并不关心单击按钮是否需要 0 1 秒或 0 2 秒 但他们确实关心第 100 次单击是否会强制执行出色的惰性计算并需要 10 秒才能继续 我在读冈崎的论文纯函数式数据结构 http ww