在可变向量上使用 par monad (parMapM)

Using par monad (parMapM) on mutable vector

提问人:HaskellEnthusiast 提问时间:9/19/2015 更新时间:9/20/2015 访问量:223

问:

我已经尝试了几个小时,但似乎无法编译它。我正在尝试对可变向量并行执行一个简单的操作,但是我遇到了编译错误。

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

在“c <- V.unsafeThaw a”行上,我收到编译错误

 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 }

在“return $ V.unsafeFreeze c”行上,我出错了

   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'

你能帮我找出我做错了什么吗?

哈斯克尔 向量 单子 全金平衡 可变

评论


答:

2赞 ErikR 9/20/2015 #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

请注意,您只能在 IO 或 ST monad 中执行。IO 当然是两者中更容易处理的。M.write

评论

0赞 HaskellEnthusiast 9/20/2015
谢谢你,这正是我所需要的。
0赞 dfeuer 9/20/2015
有什么难的?ST