使用镜片的优点和缺点是什么?

2024-02-05

Lenses http://hackage.haskell.org/package/lenses与标准 Haskell 相比,它似乎没有任何缺点,同时具有显着的优点:有什么理由我不应该尽可能使用镜头吗?有性能方面的考虑吗?此外,模板 Haskell 是否有任何显着的开销?


镜头形成了在数据构造函数上使用直接闭包的替代方案。因此,镜头与直接使用函数和数据构造函数具有大致相同的注意事项。

因此产生一些缺点:

  • 每次修改镜头时,都可能会导致(重新)创建许多对象。例如,如果您有以下数据结构:

    A { B { C { bla = "foo" } } }
    

    ...以及镜头类型Lens A String,您将创建一个新的A, B and C每次你“修改”那个镜头时。这在 Haskell 中并不罕见(创建大量对象),但对象创建隐藏在镜头后面,因此很难发现它是潜在的性能下降。

  • A lens could also create inefficiencies due to the "mapping function" being used. For example, if you make a lens that modifies the 26th element in a list, it might cause a lot of slowdowns due to the lookup time.

和优点:

  • 透镜与普通记录相结合,可以与状态单子完美地结合使用(参见data-lens-fd http://hackage.haskell.org/package/data-lens-fd例如),这使得有可能avoid由于广泛的数据共享,大多数时候都会重新创建大量对象。例如,参见focus http://hackage.haskell.org/packages/archive/data-lens-fd/2.0.2/doc/html/Data-Lens.html#v%3afocus函数,以及类似的使用模式withSomethingSnap Web 框架中的功能。
  • 显然,镜头实际上不会就地修改任何内存,因此当您需要在并发上下文中推理状态时,它们非常有用。因此,在处理各种图表时,透镜将非常有用。

然而,镜头并不总是与数据构造函数上的闭包同构。以下是一些差异(取data-lens http://hackage.haskell.org/package/data-lens作为此处的实现):

  • 大多数镜头实现使用某种形式的数据类型来将“访问器”和“修改器”存储为一对。为了data-lens,这是Store comonad http://hackage.haskell.org/packages/archive/comonad-transformers/latest/doc/html/Control-Comonad-Trans-Store.html#t%3aStore。这意味着每次创建镜头时,由于创建的数据结构都会产生非常小的额外开销。
  • 由于镜头依赖于某些未知映射的值,因此推理垃圾收集可能会变得更加困难,并且您可能会遇到(逻辑)内存泄漏,因为您忘记了您正在使用依赖于某些大内存块的非常通用的镜头。举个例子,一个镜头访问某个大向量中的一个元素,它与另一个镜头组合而成,从而隐藏了第一个镜头,使得很难看出组合的镜头仍然依赖于大量的内存。

模板 Haskell 代码在编译时运行,并且不会影响镜头的运行时性能。

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

使用镜片的优点和缺点是什么? 的相关文章

  • Haskell/GHC:使用相同模式匹配多个一元构造函数

    所以我正在尝试定义 TrieSet 数据类型 尽管我知道我不需要 http hackage haskell org package TrieMap module Temp where import Data Map data TrieSet
  • Haskell 中美元符号 ($) 和 id 函数之间有关系吗?

    这几天我正在读一篇评论莫纳德挑战 http mightybyte github io monad challenges 我强烈推荐给像我这样的 Haskell 初学者 我最终得到了这个线程 https news ycombinator co
  • Haskell 中函数和函子有什么区别?只有定义吗?

    在 Haskell 中 当编写函数时 这意味着我们将某个东西 输入 映射到另一个东西 输出 我尝试 LYAH 来理解 Functor 的定义 看起来和普通 Functor 一样 函数被称为函子有什么限制吗 Functor 是否允许有 I O
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • ErrorT 已弃用,但 exceptT 不适合

    我有一个一元计算 在某些时候 由于单子模式匹配 它开始需要 MonadFail 约束 我的简单解决方法是使用以下命令运行它 fmap either error id runErrorT 然而哎呀 Deprecated Use Control
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • 在 Haskell 中,为什么我必须在这段代码中使用美元符号?

    我仍在尝试破解这段代码 import Data Char groupsOf groupsOf n xs take n xs groupsOf n tail xs problem 8 x maximum map product groupsO
  • Haskell:无法预期类型“Integer”与实际类型“Int”

    我已经盯着这段代码有一段时间了 但我无法理解该错误消息 divisors Integer gt Integer divisors n t t lt 1 n mod n t 0 length a gt Integer length 0 len
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • 在 Yesod 生态系统中,对某些文本进行 urlencode 的最佳方式是什么?

    我想对一些文本进行 url 编码 例如 用 20 替换每个空格等 我找到了 HTTP Network HTTP Base urlEncode 并且可以使用它 但我想知道是否还有其他通常在 Yesod 生态系统中使用的东西 不幸的是 由于 U
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • Haskell Stack 从 github 安装包依赖项

    是否可以使用 Haskell 堆栈从 github 安装软件包的版本 例如在一个 cabal or a stack yaml文件 如何在 git repo branch revision 上指向依赖项 对于堆栈 The 的文档stack y
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • 找不到模块“Yesod”

    我有以下代码 LANGUAGE TypeFamilies QuasiQuotes MultiParamTypeClasses TemplateHaskell OverloadedStrings module Simple where imp
  • 为什么 ZipList 不是 List 的默认应用实例

    我目前正在学习 Haskell 中的应用程序 如果我没记错的话 列表有两个不同的应用实例 List and ZipList 第二个被定义为包装列表值的新类型 这ZipList应用实例对我来说似乎更直观 这可能是一个愚蠢的问题 但有具体原因吗
  • 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
  • 类型级别集结合律的证明

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

随机推荐

  • 看起来我正在实例化这个 SpeechAPI 接口。这怎么可能?

    我在我的项目中使用 Microsoft 文本到文本语音功能 但我对此有一个问题 实际上不是直接的问题 所以 通常程序员在创建接口时 他们会将 I 作为接口名称的前缀 如 IReadable IEnumerator 等 但我遇到过一些让我震惊
  • Unity 2D:区域颜色反转效果

    我正在尝试创建一个 GameObejct 如果处于活动状态 则会反转其后面任何内容的颜色 理想情况下 当该游戏对象出现 变为活动状态时 它会从其中心点扩展到一定大小的半径 因此 想象一个圆 其比例在 1 或 2 秒内逐渐从 x 0 和 y
  • 如何排除模板文字类型的子字符串?

    我想从模板文字类型 自 TypeScript 4 1 起可用 中排除一些子字符串 但我不知道是否可能 Example 我可以定义一个类型说 这个字符串是一个包含 2 个或更多元素的元组 即类似的东西 string number 使用这个文字
  • Symfony 2 - 在 ROLE_USER 下添加用户角色

    我正在尝试在 Symfony 2 中的默认 USER ROLE 下创建一个新角色 该角色对某些功能的写访问权限有限 我正在使用 FOSUserBundle 到目前为止 我已经编写了以下安全设置 但我的 ROLE DEMO 用户仍然获得 RO
  • Rails 时区问题

    这是我的控制台 irb main 048 0 gt Time now gt 2011 04 13 00 51 50 0200
  • Python ctypes 和动态链接

    我正在用 C 编写一些库 其中包含我想通过 ctypes 从 Python 调用的函数 我已经在另一个库中成功完成了此操作 但是该库只有非常普通的依赖项 即fstream math malloc stdio stdlib 我正在开发的另一个
  • 如何要求 XSD.exe 为我生成正确的类,以便我可以创建良好的 XML

    我从 Visual Studio 2010 创建了一个 XSD 文件 然后我用xsd c mydemo xsd为我生成类 以便我可以在运行时创建 XML 文件 但是 当我使用该类 填充一些值并序列化该对象时 XML 文件对我来说看起来不太好
  • 如何以最少的时间损失,根据数组中指定的字母表对一个大数组进行排序?

    如何以最少的时间浪费有效地按数组中指定的字母对具有百万个值的数组进行排序 letters array 按特定键对数组进行排序的简单函数 维护索引关联 该函数还对数组进行排序 但不是按我的字母表排序 而是按英文字母表排序 在英文字母中效果更好
  • 如何在 Mac 上安装 python3.4-dev?

    我已经尝试过 pip 和 homebrew pip search python3 4 dev并且brew search python并且在其中任何一个中都找不到 python3 4 dev 有任何想法吗 Pip 本身不会安装 Python
  • 使用 GDK 启动应用程序时嵌套多个语音触发器的方法

    使用 GDK 在 Google Glass 上启动应用程序时 是否可以嵌套语音触发器 例如 不要只是说 好吧 玻璃 gt 它的功率水平是多少 我想让应用程序提供一个选项 例如 好的 玻璃 gt 它的功率是多少 gt 超过 9000 或 低于
  • Rails 3.1 资产管道供应商/资产文件夹组织

    我正在使用jQuery 工具 http flowplayer org tools 我的 Rails 3 1 站点中的可滚动库 各种资源放置在供应商 资产文件夹中 效果很好 我的问题是关于组织供应商 资产下的各种文件的最佳方式 组织供应商 资
  • 为什么我的 PHP 电子邮件表单会吸引垃圾邮件?

    我建立了一个网站 我想在网页上有一个电子邮件联系表 以便有人可以向我发送消息 我正在使用该网站的代码 http www w3schools com php php secure mail asp http www w3schools com
  • 如何使 Google Drive Java SDK 读取/写入“我的云端硬盘”而不是其他地方?

    我正在使用最新的 Google Drive Java SDK 1 9 0 rev 155 并且我已经成功地使其能够上传文件 列出文件 创建目录 这非常困难 以及其他各种操作 但是我上传的内容在Web界面中是不可见的 同样Web界面中的内容对
  • 函数存储在变量中? JavaScript

    有人可以解释一下 JavaScript 中的这个表示法吗 函数 d 在做什么 在这个程序中 x 似乎是由以下调用的 但我不知道这意味着什么 提前致谢 x function d return d x width mx later x x 9
  • 查看网站是否已关闭的代码? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试复制类似的网站http w
  • JNA鼠标钩子的工作示例

    谁能给我提供一个 JNA 鼠标钩子的工作示例 它能够在我的 Java Swing 应用程序之外跟踪鼠标移动 单击 提前致谢 是的 这是代码 public class CWMouseHook public final User32 USER3
  • React 16.7 Hooks:`react.useState` 不是一个函数

    我正在尝试带有react 16 7的钩子的功能组件 出现错误 src 组件 页脚 index js function Footer const selectedTab setSelectedTab useState redTab const
  • Pandas:索引更新和更改按位置访问的值

    我有两个关于 Python Pandas 数据框的索引相关问题 import pandas as pd import numpy as np df pd DataFrame id range 1 9 B one one two three
  • 使用-jsonArray时mongoimport的速度非常慢

    我有一个 15GB 文件 包含超过 2500 万行 采用以下 json 格式 mongodb 接受该格式导入 id 1 value u041c id 2 value u041d 当我尝试使用以下命令将其导入 mongodb 时 我得到的速度
  • 使用镜片的优点和缺点是什么?

    Lenses http hackage haskell org package lenses与标准 Haskell 相比 它似乎没有任何缺点 同时具有显着的优点 有什么理由我不应该尽可能使用镜头吗 有性能方面的考虑吗 此外 模板 Haske