2014-09-16 2 views
0

주어진 벡터 요소에 적용 할 변경 목록입니다. 어떻게 이것을 돌연변이로 달성 할 수 있습니까? 내 현재 코드는 지금까지 다음과 같습니다변경 가능한 벡터의 요소에 변경 목록 적용

mapM_를 사용
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

, 당신이 할 수

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.writemapM_입니다.

+1

간단하고 좋습니다. 고맙습니다. –