提问人:HaskellEnthusiast 提问时间:9/19/2015 更新时间:9/20/2015 访问量:223
在可变向量上使用 par monad (parMapM)
Using par monad (parMapM) on mutable vector
问:
我已经尝试了几个小时,但似乎无法编译它。我正在尝试对可变向量并行执行一个简单的操作,但是我遇到了编译错误。
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
上一个:FFI 中的可变数据和懒惰
评论