1
所以我想創建一個工作方式寫作鏈突變/修改功能可變的載體
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
出來的單子m0
- 這是在,顯然,根據編譯器。這是有道理的。
有誰知道我該怎麼做?