[英]What's going on in this type signature? (Vector.Mutable modifiers in Haskell)
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
類monad上。 thaw
返回m (MVector (PrimState m) a)
,其中m
是PrimMonad
...但monad包含自身? 為什么m
在另一個m
的上下文中?
我看到一切都基本上綁定在這個PrimState
或PrimMonad
,但我不知道這與可變/可存儲的向量有什么關系。 那些允許它們存儲狀態的類型類有什么特別之處嗎?
感謝您的時間!
我認為你正在使用矢量包 ,如
import Data.Vector.Mutable
在PrimMonad
類型類之后導致低級細節; 需要注意的是兩個實例:
instance PrimMonad IO where ...
instance PrimMonad (ST s) where ...
所以(PrimMonad m)
只是說m
是IO
或(ST s)
。 這些是Haskell設置為允許你改變內存的兩個基本monad。 要清楚, m
是一個類型構造函數,將m
應用於類似Int
的類型給出一個類型: m Int
。
要強調: IO
和(ST s)
是特殊的,因為它們允許您使用此功能來“存儲狀態”來改變實際內存。 它們以Haskell其余部分隱藏的原始形式公開此功能。
現在PrimState是一個新東西:一個相關的數據類型 。 在PrimMonad
類型類中有一個聲明:
-- | Class of primitive state-transformer monads
class Monad m => PrimMonad m where
-- | State token type
type PrimState m
(PrimState m)
將在您的代碼中的類型取決於分配給它的(PrimMonad m)
實例。
instance PrimMonad IO where
type PrimState IO = RealWorld
instance PrimMonad (ST s) where
type PrimState (ST s) = s
RealWorld
類型是GHC中IO的低級內部實現細節。 附加到(ST s)
的s
類型是存在類型技巧,讓runST
證明沒有任何可變的東西逃脫了(ST s)
monad。
為了使相同的代碼在IO
和(ST s)
, PrimMonad
類型(具有關聯的PrimState
)用於提供ad-hoc重載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.