gpt4 book ai didi

list - 使用镜头插入到特定位置的列表中

转载 作者:行者123 更新时间:2023-12-04 14:14:05 26 4
gpt4 key购买 nike

我正在尝试对包含元素列表的嵌套数据结构进行操作。在尝试了各种方法后,我最终决定将镜头作为最好的方法。它们非常适合查找和修改结构的特定元素,但到目前为止,我对如何添加新元素感到困惑。

从我读过的内容来看,我不能在技术上使用遍历,因为它违反遍历法则将新元素插入列表,这是假设我什至可以首先弄清楚如何使用遍历来做到这一点(我对 Haskell 的使用仍然相当薄弱,并且镜头包中大多数东西的类型签名让我头晕目眩)。

具体来说,我想要完成的是,在与特定选择器匹配的元素列表中找到一些元素,然后在匹配的元素之前或之后插入一个新元素(在之前或之后的函数的不同参数匹配)。 Control.Lens 是否已经有一些东西可以完成我正在尝试做的事情,并且我对类型签名的理解太弱以至于看不到它?有没有更好的方法来完成我想要做的事情?

如果我只是想在列表的开头或结尾添加一个新元素,那将是相当微不足道的,但是将它插入到中间的某个特定位置是困难的部分。在我编写的一些镜头前代码中,我使用折叠来完成我想要的,但它开始在结构的更深嵌套部分变得粗糙(例如,折叠内的折叠内的折叠)所以我转向 Control.Lens 试图解开一些困惑。

最佳答案

使用 lens包装

如果我们从知道函数 id 开始可以像镜头一样使用:

import Control.Lens
> [1,2,3,4] ^. id
[1,2,3,4]

然后我们可以继续讨论如何修改列表:
> [1,2,3,4] & id %~ (99:)
[99,1,2,3,4]

以上允许在列表的开头插入。为了专注于列表的后半部分,我们可以使用 _tail 来自 Control.Lens.Cons module .
> [1,2,3,4] ^. _tail
[2,3,4]
> [1,2,3,4] & _tail %~ (99:)
[1,99,2,3,4]

现在将其推广到第 n 个位置
> :{
let
_drop 0 = id
_drop n = _tail . _drop (n - 1)
:}
> [1,2,3,4] ^. _drop 1
[2,3,4]
> [1,2,3,4] & _drop 0 %~ (99:)
[99,1,2,3,4]
> [1,2,3,4] & _drop 1 %~ (99:)
[1,99,2,3,4]

最后一步是使用 Cons instance 将其推广到所有类型。我们可以使用 cons<| .
> [1,2,3,4] & _drop 1 %~ (99<|)
[1,99,2,3,4]
> import Data.Text
> :set -XOverloadedStrings
> ("h there"::Text) & _drop 1 %~ ('i'<|)
"hi there"

关于list - 使用镜头插入到特定位置的列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18479131/

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