Haskell替换列表中的元素

Ste*_*cur 17 haskell built-in

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

例:

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

应该给:

["bar", "bar", "foo"]
Run Code Online (Sandbox Code Playgroud)

我知道我可以创建自己的功能,但它似乎应该是内置的.

ham*_*mar 33

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

> import Data.Sequence
> update 2 "foo" $ fromList ["bar", "bar", "bar"]
fromList ["bar","bar","foo"]
Run Code Online (Sandbox Code Playgroud)


mar*_*nus 12

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

replaceAtIndex n item ls = a ++ (item:b) where (a, (_:b)) = splitAt n ls
Run Code Online (Sandbox Code Playgroud)

这是O(N).如果你发现自己做了很多,请查看另一种数据类型,例如array.

  • 它通常不是"O(n)"而是"O(i)",其中`i`是拆分索引(因为只需要复制前缀).如果该索引是常量,则操作为"O(1)". (7认同)
  • 包含类型签名总是一个好主意:`replaceAtIndex :: Int - > a - > [a] - > [a]` (4认同)

gee*_*aur 10

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