在unsafeDupablePerformIO
(source,docs)的定义中,我找到了对唯一realWorld#
的引用。所以我想知道以#
结尾的所有这些函数或值的定义在哪里?我当然已找到GHC primops:它们包括seq#
,catch#
,retry#
以及所有其他有趣的功能。它还包含RealWorld
类型。但是,这些初学者似乎不包含实际值realWorld#
。
{-# NOINLINE unsafeDupablePerformIO #-}
-- See Note [unsafeDupablePerformIO is NOINLINE]
unsafeDupablePerformIO :: IO a -> a
unsafeDupablePerformIO (IO m) = lazy (case m realWorld# of (# _, r #) -> r)
-- See Note [unsafeDupablePerformIO has a lazy RHS]
(请不要混用RealWorld
和realWorld#
:第一个是类型,第二个是值。)
GHC中是否还有其他未记载的报童?或者也许所有这些都记录在某处,我还没有找到它?我可以在GHC源中查看这些内容的实现吗?
答案 0 :(得分:6)
realWorld#
是State# RealWorld
类型的值,它是作为“真实世界”引用的标记。 (有趣的是,它的大小为0,并且不占用堆栈或堆上的任何空间。)
一些背景资料。 State# RealWorld
值表示程序的整个外部运行时状态。 “现实世界”,就像它一样。程序中的main
值会收到State# RealWorld
值,该值贯穿构成它的IO
操作。 realWorld#
是评估unsafeDupablePerformIO
值时的值。
关于它的定义,它是here,无论你有什么好处。 :)