假设,我有一个List
具有鲜明的数字元素:[1, 2, 3, 4, 5]
和我想的值更改2
,以9
在列表中。
我可以使用一个简单的函数来实现这一点:
map (\x -> if x == 2 then 9 else x) [1, 2, 3, 4, 5]
但是从性能角度来看,我认为没有必要遍历整个列表,因为这些元素是不同的。是否有任何其他高阶函数可以在不进行整个列表遍历的情况下执行相同的操作?
我知道可以使用显式递归来解决此问题,但我只是想知道是否可以使用任何现有的高阶函数以有效的方式解决此问题。
如果要避免显式递归,可以执行以下操作:
modifyFirst :: (a -> Bool) -> (a -> a) -> [a] -> [a]
modifyFirst p f xs = concat [a, map f (take 1 b), drop 1 b]
where (a, b) = break p xs
modifyFirst (==2) (const 9) [1, 2, 3, 4, 5] === [1, 9, 3, 4, 5]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句