我希望有一个功能f :: Int -> a -> [a] -> [a]
在返回值是由第二个参数替换第一个参数给定的索引处的项目的第三个参数。
所以
f 1 42 [1, 2, 3] == [1, 42, 3]
我看着在谷歌与签名功能,但没有找到任何匹配什么,我一直在寻找。
是否有做了什么功能,我在Haskell的标准库中寻找什么?
不,没有这样的功能。此外,希望这是一个不好的征兆;考虑使用比列表更合适的数据结构,如果你经常需要索引。
由于您的列表是短,重复的索引可以有容忍的性能。
一个函数在给定索引处替换值,并立即摆脱困境,重新使用列表的其余部分,可以写成简单地只是
replix :: Int -> a -> [a] -> [a]
replix i x xs | i >= 0 = let (h,_:t) = splitAt i xs
in h ++ [x] ++ t
使用lens
库:
import Control.Lens
f :: Int -> a -> [a] -> [a]
f i = set (ix i)