为什么 IO 不是 State 的实例化?

Dan*_*Dos 1 io monads state haskell monad-transformers

当我们有 时,为什么不IO实例化(严格)单子,如 中所提供的?我认为我们应该是代表现实本身的神奇类型。StateRealWorldControl.Monad.STRealWorld

我的意思是,回想一下 monad 的“run”函数State

runState :: (s -> (a, s)) -> s -> a
Run Code Online (Sandbox Code Playgroud)

将其实例化为RealWorld,我们得到:

runIO :: (RealWorld -> (a, RealWorld)) -> RealWorld -> a
Run Code Online (Sandbox Code Playgroud)

RealWorld 由于无论如何我们都无法构造 的值,因此这不应该充当像 那样的后门unsafePerformIO

原因是因为这种解释将启用 monad 转换器IOT,定义为StateT RealWorld

Li-*_*Xia 6

  1. 暴露RealWorldinIO仍然会给你带来getUnsafePerformIO :: IO (IO a -> a)与 一样糟糕的结果unsafePerformIO

  2. IO使用未提升类型(RealWorld#, (#,#))来避免不必要的分配,因此它无论如何都不完全匹配State

  3. 它确实匹配,但是每当您查看 Core 或需要进行一些低级黑客操作(这比也涉及的使用更常见)时ST, 的直接定义可以最大限度地减少噪音。IOSTIO

  4. 我认为RealWorld我们应该是代表现实本身的神奇类型。

    RealWorld是一个可爱的名字,但主要是造成混乱的根源。其实并不能代表什么。最好忘记任何含义,只从操作语义的角度RealWorld来考虑这个定义。IO