Haskell 中的可变向量具有三个元素级别的修改器:
read :: PrimMonad m => MVector (PrimState m) a -> Int -> m a
write :: PrimMonad m => MVector (PrimState m) a -> Int -> a -> m ()
swap :: PrimMonad m => MVector (PrimState m) a -> Int -> Int -> m ()
现在我可以很好地使用这些——
import Data.Vector
import Data.Vector.Mutable
import Control.Monad.ST
import Control.Monad.Primitive
incrAt :: Vector Double -> Int -> Vector Double
incrAt vec i = runST $ do
mvec <- thaw vec
oldval <- read mvec i
write mvec i (oldval + 1)
freeze mvec
但是这里发生了什么?什么是PrimMonad
? 并且是PrimState
构造函数?
我知道这里有一些绑定,在一个PrimMonad
类单子上。thaw
返回m (MVector (PrimState m) a)
,m
a在哪里PrimMonad
...但是 monad 包含自己?为什么m
在另一个上下文中m
?
我看到一切基本上都绑定在 this PrimState
or上PrimMonad
,但我不明白这与可变/可存储向量有什么关系。那些允许它们存储状态的类型类有什么特别之处吗?
感谢您的时间!