是否有任何内置函数可以替换haskell中给定索引处的元素?
例子:
replaceAtIndex(2,"foo",["bar","bar","bar"])
应该给:
["bar", "bar", "foo"]
我知道我可以制作自己的功能,但它似乎应该是内置的。
如果您需要更新特定索引处的元素,列表并不是最有效的数据结构。您可能要考虑改用Seq
from Data.Sequence
,在这种情况下,您要查找的函数是update :: Int -> a -> Seq a -> Seq a
.
> import Data.Sequence
> update 2 "foo" $ fromList ["bar", "bar", "bar"]
fromList ["bar","bar","foo"]
据我所知(并且可以找到)它默认不存在。但是,存在splitAt
于Data.List
:
replaceAtIndex n item ls = a ++ (item:b) where (a, (_:b)) = splitAt n ls
虽然这是 O(N)。如果您发现自己经常这样做,请查看另一种数据类型,例如数组。
有实际的数组,但列表实际上是单链表,替换元素的概念并不那么明显(并且访问给定索引处的元素可能表明您不应该使用列表,因此可能会鼓励的操作它被避免)。
试试这个解决方案:
import Data.List
replaceAtIndex :: Int -> a -> [a] -> [a]
replaceAtIndex i x xs = take i xs ++ [x] ++ drop (i+1) xs
它的工作原理如下:
获取前 i 个项目,添加值“x”,添加其余 i+1 个项目