2015-09-19 5 views
1

Я пытался часами, но, похоже, не могу его скомпилировать. Я пытаюсь выполнить простую операцию параллельно с изменяемым вектором, но я получаю ошибки компиляции.Использование par monad (parMapM) на изменяемом векторе

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

a = V.fromList [1,2,3,4,5,6] 

b = do 
    c <- V.unsafeThaw a 
    runPar $ parMapM 
     (liftM (\i -> M.write c i 100)) 
     [0..5] 
    return $ V.unsafeFreeze c 

На линии "с < - V.unsafeThaw" Я получаю ошибку компиляции

Couldn't match type `primitive-0.5.2.1:Control.Monad.Primitive.PrimState  []' 
       with `primitive-0.5.2.1:Control.Monad.Primitive.PrimState m0' 
    NB: `primitive-0.5.2.1:Control.Monad.Primitive.PrimState' is a type function, and may not be injective 
    The type variable `m0' is ambiguous 
    Expected type: [M.MVector 
        (primitive-0.5.2.1:Control.Monad.Primitive.PrimState m0) Integer] 
    Actual type: [M.MVector 
        (primitive-0.5.2.1:Control.Monad.Primitive.PrimState []) Integer] 
    In a stmt of a 'do' block: c <- V.unsafeThaw a 
    In the expression: 
    do { c <- V.unsafeThaw a; 
      runPar $ parMapM (liftM (\ i -> M.write c i 100)) [0 .. 5]; 
      return $ V.unsafeFreeze c } 

На линии "возвращение $ V.unsafeFreeze с" Я получаю ошибку

Couldn't match type `primitive-0.5.2.1:Control.Monad.Primitive.PrimState m1' 
       with `primitive-0.5.2.1:Control.Monad.Primitive.PrimState m0' 
    NB: `primitive-0.5.2.1:Control.Monad.Primitive.PrimState' is a type function, and may not be injective 
    The type variables `m0', `m1' are ambiguous 
    Expected type: M.MVector 
        (primitive-0.5.2.1:Control.Monad.Primitive.PrimState m1) Integer 
    Actual type: M.MVector 
        (primitive-0.5.2.1:Control.Monad.Primitive.PrimState m0) Integer 
    Relevant bindings include 
    c :: M.MVector 
      (primitive-0.5.2.1:Control.Monad.Primitive.PrimState m0) Integer 
     (bound at C:\Users\Administrator\workspace\test\src\Main.hs:11:5) 
    b :: [m1 (V.Vector Integer)] 
     (bound at C:\Users\Administrator\workspace\test\src\Main.hs:10:1) 
    In the first argument of `V.unsafeFreeze', namely `c' 
    In the second argument of `($)', namely `V.unsafeFreeze c' 

Не могли бы вы помочь мне узнать, что я делаю неправильно?

ответ

1

Попробуйте это:

import qualified Data.Vector as V 
import qualified Data.Vector.Mutable as M 
import Control.Monad.Par as Par 
import Control.Monad 
import Control.Monad.Par.IO as ParIO 
import Control.Monad.Trans (liftIO) 

a = V.fromList [1,2,3,4,5,6] 

foo = do 
    mv <- V.unsafeThaw a 
    ParIO.runParIO $ parMapM (\i -> liftIO $ M.write mv i 100) [0..5] 
    V.unsafeFreeze mv 

Обратите внимание, что вы можете только выполнять M.write в монады IO или ST. IO, безусловно, легче справиться с этим.

+0

Спасибо, что это именно то, что мне нужно. – HaskellEnthusiast

+0

Что плохого в 'ST'? – dfeuer

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

  • Нет связанных вопросов^_^