Haskell の可変ベクトルには、要素レベルのミューテーターが 3 つあります。
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
... がありますが、モナドはそれ自体を含んでいますか? m
別のコンテキスト内にあるのはなぜm
ですか?
すべてが基本的に thisPrimState
またはPrimMonad
にバインドされていることがわかりますが、これが変更可能/保存可能なベクトルとどのように関係しているのかわかりません。状態を保存できる型クラスに何か特別なものはありますか?
お時間をいただきありがとうございます!