У взаимозаменяемых векторов в 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
является PrimMonad
... но монада содержит себя? Почему m
находится в контексте другого m
?
Я вижу, что все это в основном связано с этим PrimState
или PrimMonad
, но я не вижу, как это связано с изменяемыми/сохраняемыми векторами. Есть ли что-то особенное в тех классах, которые позволяют хранить состояние?
Спасибо за ваше время!