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にバインドされていることがわかりますが、これが変更可能/保存可能なベクトルとどのように関係しているのかわかりません。状態を保存できる型クラスに何か特別なものはありますか?
お時間をいただきありがとうございます!