Haskell 将更改列表应用于可变向量的元素

Haskell 将更改列表应用于可变向量的元素,haskell,vector,mutable,Haskell,Vector,Mutable,下面是我想应用于向量元素的更改列表。如何通过突变实现这一点?到目前为止,我当前的代码如下所示: import Control.Monad.ST import qualified Data.Vector.Mutable as M import qualified Data.Vector as V main :: IO () main = do let v = V.fromList [8,7,4,1,5] :: V.Vector Integer -- The elements in

下面是我想应用于向量元素的更改列表。如何通过突变实现这一点?到目前为止,我当前的代码如下所示:

import Control.Monad.ST
import qualified Data.Vector.Mutable as M
import qualified Data.Vector as V

main :: IO ()
main = do
    let v = V.fromList [8,7,4,1,5] :: V.Vector Integer
    -- The elements in changes are pairs of vector index and change to apply.
    let changes = [(0, (+1)), (3, (*3)), (2, (/2))]
    let v' = applyChanges changes v
    print $ V.toList v'

applyChanges changes v = runST $ do
    mV <- V.thaw v
    -- apply (+1) to element 0 -> [9,7,4,1,5]
    -- apply (*3) to element 3 -> [9,7,4,3,5]
    -- apply (/2) to element 2 -> [9,7,2,3,5]
    V.freeze mV
import Control.Monad.ST
将限定的Data.Vector.Mutable导入为M
导入符合条件的数据。向量为V
main::IO()
main=do
设v=v.fromList[8,7,4,1,5]::v.向量整数
--更改中的元素是成对的向量索引和要应用的更改。
设changes=[(0,(+1)),(3,(*3)),(2,(/2))]
设v'=应用更改v
打印$V.toList V'
applyChanges changes v=runST$do
mV[9,7,4,1,5]
--将(*3)应用于元素3->[9,7,4,3,5]
--将(/2)应用于元素2->[9,7,2,3,5]
V.冻结

使用
mapM
,您可以

apply mvec (idx, f) = do
    val <- M.read mvec idx
    M.write mvec idx $ f val

applyChanges :: [(Int, Integer -> Integer)] -> V.Vector Integer -> V.Vector Integer
applyChanges changes vec = runST $ do
    mV <- V.thaw v
    mapM_ (apply mV) changes
    V.freeze mV

main = do
    let v = V.fromList [8,7,4,1,5] :: V.Vector Integer
    let changes = [(0, (+1)), (3, (*3)), (2, (/2))]
    print $ V.toList $ applyChanges changes v
apply mvec(idx,f)=do
val Integer)]->V.向量整数->V.向量整数
applyChanges changes vec=runST$do

mV使用
mapM
,您可以

apply mvec (idx, f) = do
    val <- M.read mvec idx
    M.write mvec idx $ f val

applyChanges :: [(Int, Integer -> Integer)] -> V.Vector Integer -> V.Vector Integer
applyChanges changes vec = runST $ do
    mV <- V.thaw v
    mapM_ (apply mV) changes
    V.freeze mV

main = do
    let v = V.fromList [8,7,4,1,5] :: V.Vector Integer
    let changes = [(0, (+1)), (3, (*3)), (2, (/2))]
    print $ V.toList $ applyChanges changes v
apply mvec(idx,f)=do
val Integer)]->V.向量整数->V.向量整数
applyChanges changes vec=runST$do
mV