是否有任何内置函数可以替换haskell中给定索引处的元素?
示例:
replaceAtIndex(2,"foo",["bar","bar","bar"])
应该给:
["bar", "bar", "foo"]
我知道我可以创建自己的功能,但它似乎应该是内置的。
答案 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个项目