[英]How to solve Alphametics puzzle using the State Monad and mutable Vector?
[英]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.