是否s在STRef s a得到一个具体的类型实例?人们可以很容易想象一些代码,其中STRef一个方面,其中用于 a呈现Int.但是,类型推断似乎没有任何东西可以提供s具体类型.
想象一下伪Java中的东西MyList<S, A>.即使S从未出现过MyList实例化具体类型的实现,例如MyList<S, Integer>在没有使用具体类型的地方S也没有意义.那么怎么STRef s a办?
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)
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |