在Haskell中创建一个可变的Data.Vector

时间:2014-03-30 01:59:08

标签: haskell vector mutable

我希望使用Data.Vector.Generic.Mutable.new创建一个可变向量。我找到了通过解冻纯矢量来创建可变矢量的例子,但这不是我想要做的。

以下是许多尝试失败的尝试之一:

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 Vector教程的变体而没有运气。

我也欢迎有关构建载体的更清洁方法的建议。对RealWorld的引用对我来说似乎很难看。

2 个答案:

答案 0 :(得分:4)

GM.MVector v a中的v constaint是不明显的。{1}}。换句话说,根据您提供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 :(得分:2)

我认为问题是你必须给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