我认为你正在使用矢量包 http://hackage.haskell.org/packages/archive/vector/0.10.0.1/doc/html/Data-Vector-Mutable.html, as in
import Data.Vector.Mutable
继PrimMonad
类型类导致低级细节;需要注意的是两个实例:
instance PrimMonad IO where ...
instance PrimMonad (ST s) where ...
So (PrimMonad m)
只是一种说法m
或者是IO
or (ST s)
。这是 Haskell 设置的两个基本 monad,可以让你改变内存。需要明确的是,m
是一个类型构造函数并应用m
像这样的类型Int
给出一个类型:m Int
.
强调一下:IO
and (ST s)
很特别,因为它们允许您使用这种改变实际内存的能力来“存储状态”。他们以 Haskell 其余部分隐藏的原始形式公开了此功能。
现在 PrimState 是一个新事物:关联数据类型 http://www.haskell.org/ghc/docs/latest/html/users_guide/type-families.html#assoc-decl。在里面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
The RealWorld
type 是 GHC 中 IO 的低级内部实现细节。这s
类型附加到(ST s)
是存在主义类型的技巧,让runST
证明没有任何可变的东西逃脱了(ST s)
monad.
为了使相同的代码工作IO
and (ST s)
the PrimMonad
类型类(带有关联的PrimState
) 用于提供临时重载。