2014-03-30 22 views
2

我希望使用Data.Vector.Generic.Mutable.new創建一個可變的向量。我發現了通過融合純矢量來創建可變向量的例子,但這不是我想要做的。在Haskell中創建一個可變的Data.Vector

這裏有許多失敗的嘗試之一:

import Control.Monad.Primitive 
import qualified Data.Vector.Generic.Mutable as GM 

main = do 
    v <- (GM.new 10) :: (GM.MVector v a) => IO (v RealWorld a) 
    GM.write v 0 (3::Int) 
    x <- GM.read v 0 
    putStrLn $ show x 

給我的錯誤

No instance for (GM.MVector v0 Int) 
    arising from an expression type signature 
Possible fix: add an instance declaration for (GM.MVector v0 Int) 

我試圖基於Haskell的矢量教程,沒有運氣的變化。

我也歡迎建議更清潔的方法來構建載體。 RealWorld的參考對我來說似乎很難看。

回答

2

GM.MVector v a constaint是v ambigous。換句話說,從你給出的GHC的類型信息,它仍然無法弄清楚你希望它使用什麼特定的實例GM.MVector。對於Int的可變向量,使用Data.Vector.Unboxed.Mutable

import qualified Data.Vector.Unboxed.Mutable as M 

main = do 
    v <- M.new 10 
    M.write v 0 (3 :: Int) 
    x <- M.read v 0 
    print x 
1

我認爲問題是,你必須給v具體類型 - 這樣的:

import Control.Monad.Primitive 
import qualified Data.Vector.Mutable as V 
import qualified Data.Vector.Generic.Mutable as GM 

main = do 
    v <- GM.new 10 :: IO (V.MVector RealWorld Int) 
    GM.write v 0 (3::Int) 
    x <- GM.read v 0 
    putStrLn $ show x 
+0

與我的代碼的密切通信幫助我提高了我的類型聲明技能。 – chris

相關問題