Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell替换列表中的元素_Haskell_Built In - Fatal编程技术网

Haskell替换列表中的元素

Haskell替换列表中的元素,haskell,built-in,Haskell,Built In,haskell中是否有任何内置函数来替换给定索引处的元素 例如: replaceAndex(2,“foo”、[“bar”、“bar”、“bar”]) 应提供: ["bar", "bar", "foo"] 我知道我可以创建自己的函数,但它似乎应该是内置的。有实际的数组,但列表实际上是单独链接的列表,替换元素的概念并不那么明显(在给定索引处访问元素可能表明您不应该使用列表,因此可以避免可能鼓励使用列表的操作)。据我所知(并且可以找到),默认情况下它不存在。但是,数据中存在拆分。list因此: re

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

例如:

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