2014-09-16 5 views
0

Дано Список изменений, которые я хочу применить к элементам вектора. Как это можно достичь с помощью Mutation? Мой текущий код выглядит следующим образом до сих пор:Применить список изменений к элементам изменяемого вектора

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 

ответ

4

Используя 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_.

+1

Простые и хорошие. Большое спасибо. –

Смежные вопросы