STRef和幻像类型

use*_*220 8 haskell

是否sSTRef s a得到一个具体的类型实例?人们可以很容易想象一些代码,其中STRef一个方面,其中用于 a呈现Int.但是,类型推断似乎没有任何东西可以提供s具体类型.

想象一下伪Java中的东西MyList<S, A>.即使S从未出现过MyList实例化具体类型的实现,例如MyList<S, Integer>在没有使用具体类型的地方S也没有意义.那么怎么STRef s a办?

GS *_*ica 4

tl;dr - 在实践中似乎它总是RealWorld最终被初始化

源代码指出可以s实例化为RealWorld的内部调用stToIO,但否则未实例化:

-- s 参数是

-- 未实例化的类型变量(在“runST”的调用中),或者

--“RealWorld”(“Control.Monad.ST.stToIO”内部调用)。

但看看实际的代码,ST它似乎runST使用了一个特定的值realWorld#

newtype ST s a = ST (STRep s a)
type STRep s a = State# s -> (# State# s, a #)

runST :: (forall s. ST s a) -> a
runST st = runSTRep (case st of { ST st_rep -> st_rep })

runSTRep :: (forall s. STRep s a) -> a
runSTRep st_rep = case st_rep realWorld# of
                        (# _, r #) -> r
Run Code Online (Sandbox Code Playgroud)

realWorld#被定义为GHC 源代码中的魔法原语

realWorldName     = mkWiredInIdName gHC_PRIM  (fsLit "realWorld#")
                                    realWorldPrimIdKey realWorldPrimId

realWorldPrimId :: Id   -- :: State# RealWorld
realWorldPrimId = pcMiscPrelId realWorldName realWorldStatePrimTy
                     (noCafIdInfo `setUnfoldingInfo` evaldUnfolding
                                  `setOneShotInfo` stateHackOneShot)
Run Code Online (Sandbox Code Playgroud)

您还可以在以下位置确认这一点ghci

Prelude> :set -XMagicHash
Prelude> :m +GHC.Prim
Prelude GHC.Prim> :t realWorld#
realWorld# :: State# RealWorld
Run Code Online (Sandbox Code Playgroud)