gpt4 book ai didi

haskell - 谁能解释 GHC 对 IO 的定义?

转载 作者:行者123 更新时间:2023-12-04 17:09:00 25 4
gpt4 key购买 nike

标题非常自我描述,但有一个部分引起了我的注意:

newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #))
剥离 newtype ,我们得到:
State# RealWorld -> (# State# RealWorld, a #)
不知道是什么 State#代表。我们可以用 State 替换它吗?像这样:
State RealWorld -> (State RealWorld, a)
那可以这样表达吗?
State (State RealWorld) a
这个特殊的结构引起了我的注意。

我知道从概念上讲,
type IO a  =  RealWorld -> (a, RealWorld)
@R.MartinhoFernandes 告诉我,我实际上可以将该实现视为 ST RealWorld a ,但我只是好奇为什么特定的 GHC 版本是这样写的。

最佳答案

最好不要对 GHC 对 IO 的实现考虑太深。 ,因为那个实现是奇怪和阴暗的,而且大部分时间都是靠编译器的魔法和运气来工作的。 GHC 使用的损坏模型是 IO Action 是从整个现实世界的状态到与整个现实世界的新状态配对的值的函数。有关这是一个奇怪模型的幽默证明,请参阅 acme-realworld 包裹。

这种“工作”的方式:除非您导入名称以 GHC. 开头的奇怪模块,你永远不能碰这些State#事物。您只能访问处理 IO 的函数或 ST并确保 State#不能重复或忽略。这个State#通过程序线程化,这确保了 I/O 原语实际上以正确的顺序被调用。由于这一切都是为了伪装,State#根本不是一个正常值——它的宽度为 0,占用 0 位。

为什么State#接受类型参数?这是一个更漂亮的魔法。 ST使用它来强制保持状态线程分离所需的多态性。对于 IO , 它与特殊魔法 RealWorld 一起使用类型参数。

关于haskell - 谁能解释 GHC 对 IO 的定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28587552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com