我想要一个函数f :: Int -> a -> [a] -> [a]
,该函数的返回值是第三个参数,并将第一个参数给定的索引处的项目替换为第二个参数。
所以
f 1 42 [1, 2, 3] == [1, 42, 3]
我在Hoogle上查找了具有该签名的函数,但没有找到与我所寻找的匹配的函数。
在Haskell标准库中是否有要执行的功能?
答案 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
答案 2 :(得分:0)
使用lens
库:
import Control.Lens
f :: Int -> a -> [a] -> [a]
f i = set (ix i)