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?
暴露RealWorldinIO仍然会给你带来getUnsafePerformIO :: IO (IO a -> a)与 一样糟糕的结果unsafePerformIO。
IO使用未提升类型(RealWorld#, (#,#))来避免不必要的分配,因此它无论如何都不完全匹配State。
它确实匹配,但是每当您查看 Core 或需要进行一些低级黑客操作(这比也涉及的使用更常见)时ST, 的直接定义可以最大限度地减少噪音。IOSTIO
我认为
RealWorld我们应该是代表现实本身的神奇类型。
RealWorld是一个可爱的名字,但主要是造成混乱的根源。其实并不能代表什么。最好忘记任何含义,只从操作语义的角度RealWorld来考虑这个定义。IO