簡體   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