Haskell替换列表中的元素

时间:2012-04-12 23:40:05

标签: haskell built-in

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

示例:

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

应该给:

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

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

4 个答案:

答案 0 :(得分:33)

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

> import Data.Sequence
> update 2 "foo" $ fromList ["bar", "bar", "bar"]
fromList ["bar","bar","foo"]

答案 1 :(得分:12)

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

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

这是O(N)。如果您发现自己这么做了,请查看另一种数据类型,例如array。

答案 2 :(得分:10)

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

答案 3 :(得分: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个项目