Haskell标准库中是否有一个函数可以替换列表中的项目?

时间:2019-02-02 01:42:31

标签: haskell

我想要一个函数f :: Int -> a -> [a] -> [a],该函数的返回值是第三个参数,并将第一个参数给定的索引处的项目替换为第二个参数。

所以

f 1 42 [1, 2, 3] == [1, 42, 3]

我在Hoogle上查找了具有该签名的函数,但没有找到与我所寻找的匹配的函数。

在Haskell标准库中是否有要执行的功能?

3 个答案:

答案 0 :(得分:6)

不,没有这样的功能。另外,想要这是一个不好的信号。如果您经常需要索引,请考虑使用比列表更合适的数据结构。

答案 1 :(得分:1)

由于列表很短,因此重复索引的性能可以接受。

一个函数可以替换给定索引处的值并立即纾困,从而重用列表的其余部分,可以简单地编写

replix :: Int -> a -> [a] -> [a]
replix i x xs | i >= 0 = let (h,_:t) = splitAt i xs
                         in h ++ [x] ++ t

使用内置的splitAt :: Int -> [a] -> ([a], [a])

答案 2 :(得分:0)

使用lens库:

import Control.Lens

f :: Int -> a -> [a] -> [a]
f i = set (ix i)