繁体   English   中英

这种签名发生了什么? (Haskell中的Vector.Mutable修饰符)

[英]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) ,其中mPrimMonad ...但monad包含自身? 为什么m在另一个m的上下文中?

我看到一切都基本上绑定在这个PrimStatePrimMonad ,但我不知道这与可变/可存储的向量有什么关系。 那些允许它们存储状态的类型类有什么特别之处吗?

感谢您的时间!

我认为你正在使用矢量包 ,如

import Data.Vector.Mutable

PrimMonad类型类之后导致低级细节; 需要注意的是两个实例:

instance PrimMonad IO where ...
instance PrimMonad (ST s) where ...

所以(PrimMonad m)只是说mIO(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM