是否存在可变载体的就地映射函数?

时间:2017-09-10 04:39:28

标签: haskell vector

如果我有一个可变向量(例如类型为IOVector a),是否有类似地图的函数可以修改元素?

vector包提供modify函数,但这一次只有一个元素。我应该使用它还是有首选方法?

为了澄清,矢量的类型在之前和之后都是相同的。

1 个答案:

答案 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映射它们可能会更好。如果该代码最终正确融合,则中间向量将永远不会被实现。