簡體   English   中英

在可變向量上使用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 ci 100)) [0 .. 5]; return $ V.unsafeFreeze c } 

在“返回$ 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' 

您能幫我找出我做錯了什么嗎?

嘗試這個:

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單M.write中執行M.write IO當然是兩者中較容易處理的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM