Haskell替换列表中的元素
haskell中是否有任何内置函数来替换给定索引处的元素 例如:Haskell替换列表中的元素,haskell,built-in,Haskell,Built In,haskell中是否有任何内置函数来替换给定索引处的元素 例如: replaceAndex(2,“foo”、[“bar”、“bar”、“bar”]) 应提供: ["bar", "bar", "foo"] 我知道我可以创建自己的函数,但它似乎应该是内置的。有实际的数组,但列表实际上是单独链接的列表,替换元素的概念并不那么明显(在给定索引处访问元素可能表明您不应该使用列表,因此可以避免可能鼓励使用列表的操作)。据我所知(并且可以找到),默认情况下它不存在。但是,数据中存在拆分。list因此: re
replaceAndex(2,“foo”、[“bar”、“bar”、“bar”])
应提供:
["bar", "bar", "foo"]
我知道我可以创建自己的函数,但它似乎应该是内置的。有实际的数组,但列表实际上是单独链接的列表,替换元素的概念并不那么明显(在给定索引处访问元素可能表明您不应该使用列表,因此可以避免可能鼓励使用列表的操作)。据我所知(并且可以找到),默认情况下它不存在。但是,
数据中存在拆分。list
因此:
replaceAtIndex n item ls = a ++ (item:b) where (a, (_:b)) = splitAt n ls
这是O(n)。如果你发现自己做了很多事情,看看另一个数据类型,比如数组。
如果你需要更新一个特定索引中的元素,列表不是最有效的数据结构。你可能想考虑使用<代码> SEQ < /Cord>,在这种情况下,你要寻找的函数是:
尝试以下解决方案:
import Data.List
replaceAtIndex :: Int -> a -> [a] -> [a]
replaceAtIndex i x xs = take i xs ++ [x] ++ drop (i+1) xs
其工作原理如下:
获取第一个i项,添加值“x”,添加其余的i+1项通常不是O(n)
,而是O(i)
,其中i
是拆分索引(因为只需要复制前缀)。如果该索引为常量,则操作为O(1)
。包含类型签名总是一个好主意:replacateIndex::Int->a->[a]->[a]
这似乎正是我所需要的。谢谢!我已经这样做了。现在,我如何将Seq a更改为a?@Mickaelbergeronéron你可以用Data.Foldable.foldr(:)从Seq a
中获得[a]
。如果您有一个f::a->a->a
操作,您可以使用一些初始元素(如0)调用Data.Foldable.foldr f
,以获得组合的a
值。@Mickaelbergeronéron我们还可以使用Data.Foldable.foldMap(:[])
(或使用其他幺半群,如数字的Data.Foldable.foldMap Sum
等)。添加了简要说明。。。
import Data.List
replaceAtIndex :: Int -> a -> [a] -> [a]
replaceAtIndex i x xs = take i xs ++ [x] ++ drop (i+1) xs