如果我有一个可变向量(例如类型为IOVector a
),是否有类似地图的函数可以修改元素?
vector
包提供modify
函数,但这一次只有一个元素。我应该使用它还是有首选方法?
为了澄清,矢量的类型在之前和之后都是相同的。
答案 0 :(得分:6)
是的,如果要修改元素,请使用modify
。如果您发现自己经常修改所有内容,可以按如下方式定义mapModify
。
import Data.Foldable (for_)
import qualified Data.Vector.Mutable as MV
mapModify :: (a -> a) -> IOVector a -> IO ()
mapModify f v = for_ [0 .. MV.length v - 1)] (MV.modify v f)
也就是说,不断修改向量中的所有元素听起来好像使用不可变向量并使用常规fmap
映射它们可能会更好。如果该代码最终正确融合,则中间向量将永远不会被实现。