gpt4 book ai didi

haskell - Haskell的Lens库中 `ix`和 `at`有什么区别

转载 作者:行者123 更新时间:2023-12-03 10:28:51 27 4
gpt4 key购买 nike

我只知道一个有效,另一个无效。

上下文:
我有一个数据结构F其中包含 Data.Map.Map k S到另一个数据结构 S .我的目标是建立一个 Lens给出 Fk将描述 S 中的一个字段.

困难在于关键k可能不在 map 中。很好,该函数可以将其返回值包装在 Maybe 中。但是,我无法使用 at 通过 Maybe 传播镜头。 .在阅读了很多 Stack Overflow 的答案后,我遇到了 this one .

原来替换atix如果我也替换了 (^.),则解决了我的类型问题与 (^?) .

问题:
好像是 atix做同样的事情,至少对于 Map .两者都取一个键并为该键的值提供一个“镜头”。但是,ix似乎与函数组合运算符 (.) 配合得很好.两者有什么区别?

离题咆哮:

我和其他人一样喜欢中缀运算符,但 Control.Lens 包似乎有点过火了。对于一个有一些英文名字和某个地方的键的新用户来说,学习曲线会降低。由于 Lens 库中使用了大量的包装类,如果您还不知道发生了什么,则特别难以挖掘类型签名。看在老天的份上,我的代码开始看起来像 Perl。

最佳答案

atix如果您查看包含这些函数的类的可用实例,那么它们的不同就已经很明显了:

  • At 的实例: Map, IntMap, HashMap
  • Ixed 的实例: [a]、Map、ByteString、Text 等等

  • 所有实例如果 At也是 Ix 的一个实例,但不是 Ix 的所有实例也是 At 的一个实例.

    那么它们之间有什么区别呢? At用于允许插入容器中不存在的键的容器。这对于 map 显然是可能的,但不是例如列表。为了仍然能够对列表进行索引并更改其中的项目, Ix不允许创建新项目,但当您尝试写入不存在的 key 时只是“什么都不做”。
    >>> Data.Map.fromList [('a', 1)] & at 'b' .~ Just 4 
    fromList [('a',1),('b',4)] -- Inserts value
    >>> Data.Map.fromList [('a', 1)] & ix 'b' .~ 4
    fromList [('a',1)] -- Does nothing because key is not present

    ( a .~ Just ba ?~ b 还有一个快捷方式)

    从技术上讲,这种差异源于 ixTraversalatLens .因为 at是一个“返回”一个 Maybe Something 的镜头,你不能用一个只拍摄一个普通的“Something”的镜头来构图。 ix是一个具有 0 或 1 值的遍历,因此您可以像任何其他遍历一样组合 ix(就像您可以编写 traverse . traverse 一样)。 (^?)只取该遍历的第一个值(头)。

    你总是可以推导出 ix来自 at :
    ixAt = at . traverse

    同定义 is already in lens , 除非它使用 (<.)用于组合以保持索引从 at。 ( atix 都是索引镜头/遍历)。

    题外话:lens 中的大多数运算符也有中缀名,您可以在以下位置找到(不完整的)表格: https://github.com/ekmett/lens/wiki/Operators

    关于haskell - Haskell的Lens库中 `ix`和 `at`有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18414177/

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