Was ist los in dieser Typensignatur? (Vector.Mutable-Modifikatoren in Haskell)
Mutable Vektoren in Haskell haben drei Mutatoren auf Elementebene:
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 ()
Jetzt kann ich diese gut verwenden -
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
Aber was ist hier los? Was ist einPrimMonad
? Und istPrimState
ein Konstrukteur?
Ich verstehe, dass es hier eine Bindung gibt, auf einePrimMonad
Klassenmonade.thaw
kehrt zurückm (MVector (PrimState m) a)
, woherm
ist einPrimMonad
... aber die Monade enthält sich selbst? Warum istm
im Kontext eines anderenm
?
Ich sehe, dass dies im Grunde genommen alles verbindlich istPrimState
oderPrimMonad
, aber ich verstehe nicht, wie das mit veränderlichen / speicherbaren Vektoren zu tun hat. Gibt es etwas Besonderes an diesen Typklassen, mit denen sie den Status speichern können?
Vielen Dank für Ihre Zeit!