22

是否有任何内置函数可以替换haskell中给定索引处的元素?

例子:

replaceAtIndex(2,"foo",["bar","bar","bar"])

应该给:

["bar", "bar", "foo"]

我知道我可以制作自己的功能,但它似乎应该是内置的。

4

4 回答 4

37

如果您需要更新特定索引处的元素,列表并不是最有效的数据结构。您可能要考虑改用Seqfrom Data.Sequence,在这种情况下,您要查找的函数是update :: Int -> a -> Seq a -> Seq a.

> import Data.Sequence
> update 2 "foo" $ fromList ["bar", "bar", "bar"]
fromList ["bar","bar","foo"]
于 2012-04-13T00:30:51.443 回答
15

据我所知(并且可以找到)它默认不存在。但是,存在splitAtData.List

replaceAtIndex n item ls = a ++ (item:b) where (a, (_:b)) = splitAt n ls

虽然这是 O(N)。如果您发现自己经常这样做,请查看另一种数据类型,例如数组。

于 2012-04-12T23:48:48.057 回答
10

有实际的数组,但列表实际上是单链表,替换元素的概念并不那么明显(并且访问给定索引处的元素可能表明您不应该使用列表,因此可能会鼓励的操作它被避免)。

于 2012-04-12T23:47:01.530 回答
0

试试这个解决方案:

import Data.List

replaceAtIndex :: Int -> a -> [a] -> [a]    
replaceAtIndex i x xs = take i xs ++ [x] ++ drop (i+1) xs

它的工作原理如下:

获取前 i 个项目,添加值“x”,添加其余 i+1 个项目

于 2020-11-27T08:32:09.527 回答