gpt4 book ai didi

haskell - 数据映射 : how do I tell if I "need value-strict maps"?

转载 作者:行者123 更新时间:2023-12-03 15:08:45 25 4
gpt4 key购买 nike

Data.Map.Lazy 之间进行选择时和 Data.Map.Strict ,文档告诉我们前者:

API of this module is strict in the keys, but lazy in the values. If you need value-strict maps, use Data.Map.Strict instead.



对于后者同样:

API of this module is strict in both the keys and the values. If you need value-lazy maps, use Data.Map.Lazy instead.



比我更老练的 Haskellers 怎么能凭直觉知道这种“需要”?用例,在运行并完成(即不是守护进程/长时间运行)命令行工具中: readFile一个简单的 lines - 基于自定义配置文件,其中许多(不是全部)行定义要收集到 Map 中的键:值对.完成后,我们根据其中稍后读取的其他值重写其中的许多值(由于不变性,在此过程中,我们创建一个新的 Map 并丢弃初始化身)。

(虽然在实践中这个文件可能不会经常或永远不会达到 1000 行,但我们只是假设为了了解某些用户不久它会达到。)

该工具的任何给定运行可能会查找大约 20-100% 的(在加载时重写,尽管使用惰性评估我永远不太确定“何时真正”)键:值对,在一次到几十次之间的任何地方。

我如何推断“value-strict”和“value-lazy”之间的区别 Data.Map在这里吗?如果您愿意,就主流计算而言,“幕后”会发生什么?

从根本上说,这样的哈希图当然是关于“存储一次,多次查找”——但是,在计算中,“根本上”不是。此外,lazy-eval 的 thunk 的整个概念似乎都归结为这个原则,那么为什么不总是保持 value-lazy 呢?

最佳答案

How do I reason about the differences between "value-strict" and "value-lazy" Data.Maps here?



值惰性是 Haskell 中的常态。这意味着不仅存储值,还存储 thunk(即如何计算值的方法)。例如,假设您从这样的行中提取值:
tail (dropUntil (==':') line)

然后一个值严格的映射实际上会在插入时提取值,而一个懒惰的映射会很高兴地记住如何获取它。这也是你在 lookup 上会得到的。

以下是一些优点和缺点:
  • 惰性值可能需要更多内存,不仅用于 thunk 本身,还用于那里引用的数据(此处为 line)。
  • 严格值可能需要更多内存。在我们的例子中,当字符串被解释为产生一些需要内存的结构(如列表、JSON 或 XML)时,情况可能就是这样。
  • 如果您的代码不需要每个值,则使用惰性值可能需要更少的 CPU。
  • 当最终需要该值时,太深的 thunk 嵌套可能会导致堆栈溢出。
  • 还有一个语义上的区别:在惰性模式下,如果您只需要查看是否 key 存在。在严格模式下,您的程序在插入时会崩溃。

  • 与往常一样,没有固定的措施,例如:“如果您的评估值需要少于 20 个字节并且计算时间少于 30µs,请使用严格,否则使用惰性。”

    通常,您只使用一个,当您注意到极端的运行时/内存使用情况时,您会尝试另一个。

    关于haskell - 数据映射 : how do I tell if I "need value-strict maps"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41299684/

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