[英]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.