1

Vector の Binary インスタンスを作成しようとしています。

import qualified Data.Vector as V
import qualified Data.Vector.Mutable as MV
import Data.Binary


instance (Binary a) => Binary (V.Vector a) where
    put = vput
    get = vget

実装は次のとおりです。最初に長さを出力し、次にすべてのデータポイントを出力します

vput v = (put (V.length v)) >> (put `V.mapM_` v)

問題はvget. 使用したいと思いますV.create(非常に大きなベクトルを出力することを計画していますが、セマンティクスは非常に適しているようです。

これが私の試みです:

vget :: (Binary a) => Get (V.Vector a)
vget = do
    size <- get
    vec <- liftM V.create $ do
        v <- (liftM MV.new) size
        forM_ [0..(size-1)] $ \i -> do
            val <- get
            (liftM3 MV.write) v i val
        return v -- This is line 22
    return vec

エラーは

SerializeVector.hs:22:16:
    Couldn't match expected type `forall s. ST s (MV.MVector s a0)'
            with actual type `Get a10'

私はこれを推論し、ランダムに s を挿入しようとしましliftMたが、役に立ちませんでした。

4

2 に答える 2

6

V.replicateMを埋めるのに使えませんVectorか?

vget :: (Binary a) => Get (V.Vector a)
vget = get >>= (`V.replicateM` get)
于 2012-05-07T18:44:42.753 に答える
3

ここでの問題は、2つのモナドを作成しようとしていることです:STGet

   vec <- liftM V.create $ do
        v <- (liftM MV.new) size
        forM_ [0..(size-1)] $ \i -> do
            val <- get                -- run an action in the `Get` monad
            (liftM3 MV.write) v i val -- write it in the `ST` monad

これは不可能です。アクションからのST呼び出しを実行できるようにするには、トランスフォーマーが必要です。トランスフォーマーモナドパッケージを使用することも、getモナドからSTビルダーに一連の読み取りを遅延的にストリーミングすることもできます。getSTST

于 2012-05-07T17:47:51.770 に答える