gpt4 book ai didi

Haskell 按索引更新子列表

转载 作者:行者123 更新时间:2023-12-02 16:01:52 24 4
gpt4 key购买 nike

在尝试学习 Haskell 时,我最近几次遇到过这个简单的模式:

假设我有一个列表,我想更新子列表中的所有元素,例如从索引 i 到 j。

我能想到的所有解决方案都让人感觉非常糟糕和糟糕,就像这个例子:

import qualified Data.Sequence as S

increment :: Int -> Int -> S.Seq Int -> S.Seq Int
increment i j sq | i <= j = increment (i + 1) to (S.adjust (+1) i sq)
| otherwise = sq

我想如果有一个列表的话,情况会变得更糟。

有人知道一些简单的方法吗?我尝试过搜索,也查看了标准库(Data.Array、Data.Vector 等),但它的编写方式有些让我的眼睛流血,我需要一些人性化的建议

最佳答案

I have tried searching, and also looking at the standard libaries (Data.Array, Data.Vector etc) but there's something about the way it's written that makes my eyes bleed a little bit and I want some human advice

是的,直接使用 Data.Array与涉及索引的问题对偶。对于不可变数组,可以使用 accum函数使用 (index, value) 列表更新数组元素对来指定索引和值。

例如,假设我们需要向数组 [1,2,3,4,5,6,7,8,9,10] 的元素加 1从索引 2 到 4。

首先,从列表 [1,2,3,4,5,6,7,8,9,10] 构造一个数组:

testArray = let xs = [1..10] in listArray (0, length xs-1) xs

并申请accum数组的函数:

increment' i j ary = accum (+) ary (zip [i..j] (repeat 1))

请注意(zip [i..j] (repeat 1))构造一个对的列表,如果 i = 2 and j = 4给出:

[(2, 1), (3, 1), (4, 1)]

pair 的第一个值是数组的索引,第二个值是 (+) 的第二个参数, accum检索特定索引的值并应用(+1)到值(value),这正是我们想要的。测试它:

elems $ increment' 2 4 testArray

给出

[1,2,4,5,6,6,7,8,9,10]

否则,如果您只想用新值替换数组的旧值,而不关心旧值是什么。 accum函数也可以应用在这种情况下。例如,假设将索引 2 到 4 的元素替换为 0 :

accum (flip const) testArray (zip [2..4] (repeat 0))

关于Haskell 按索引更新子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54056959/

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