【发布时间】:2013-06-29 06:27:33
【问题描述】:
所以我想创建一个与
工作方式相同的方法import Data.Vector as V
import Data.Vector.Mutable as MV
import Control.Monad.ST
type DoubleVec = V.Vector Double
incrAndSwap :: DoubleVec -> Int -> Int -> Int -> DoubleVec
incrAndSwap vec i a b = runST $ do
mvec <- V.thaw vec
oldval <- MV.read mvec i -- 1
MV.write mvec i (val + 1) -- 2
MV.swap mvec a b
V.freeze mvec
但是能够将两条标记的行“浓缩”成一个函数,并且能够说:
incrAndSwap :: DoubleVec -> Int -> Int -> Int -> DoubleVec
incrAndSwap vec i a b = runST $ do
mvec <- V.thaw vec
incrAt mvec i
MV.swap mvec a b
V.freeze mvec
基本上,写那个incrAt i函数。
我尝试复制MV.write 的类型签名,但我无法使用类型签名得到任何东西;没有编译。
这是我最近的尝试
import Control.Monad.Primitive
type MDoubleVec s = MV.STVector s Double
incrAt :: (PrimMonad m) => MDoubleVec (PrimState m) -> Int -> m ()
incrAt mvec i = MV.write mvec i (val + 1)
where
val = MV.read mvec i -- val is stuck in monad m0
但我不知道如何将 val 从 monad m0 中取出——显然,根据编译器的说法,它就在其中。这是有道理的。
有人知道我该怎么做吗?
【问题讨论】: