[英]Apply a list of changes to elements of a mutable Vector
給出的是我要應用於Vector元素的更改列表。 突變如何實現? 到目前為止,我當前的代碼如下:
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
使用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
我實際上所做的就是編寫一個函數,該函數接受一個矢量和一個要應用的更改,然后將其映射到列表中的所有更改。 必要的步驟是M.read
, M.write
和mapM_
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.