我们知道,在 Haskell 程序中,几乎每一次计算都会返回一些东西,而这样的返回值可以被另一个计算捕获,以对其进行更多的转换。所以如果我们“扁平化”一个普通的 Haskell 程序,它应该是:
-- pure `a`: comes from Hask; not from file, network or any
-- other side-effected devices
a → a' → a'' → a''' → .... → a_fin
当然,这个纯值可能是“上下文”的。但我们仍然可以追溯交替的路径:
a → m a → m a' → a'' → n a''' → ... → z a_fin
对我来说,这表明我们可以控制我们的程序以避免副作用和其他“意外”,这可能是由于缺少类型系统或我们自己造成的。但是当IO ()
出现时,似乎缺少:
--!! What happened between the IO () and the next computation ?
a → m a → m a' → IO () >> b → b' → m b'
似乎什么都没有传递/接收,IO ()
但它至少必须读/写一些东西。特别是如果我们考虑“接收者”过程:
Sender:: a → m a → m a' → IO () >> b → b' → m b' ... → m b_fin
Receiver:: IO a' → IO a'' → IO a''' → ... → IO a_fin
a
在发件人中,我们看不到IO ()
. 但如果我们同时考虑这两个过程,缺失的部分又回来了!所以我们可以说我们错过了或没有错过信息,根据你的观点。这是信息泄漏,我们只是放弃了对程序的控制,当我们将 放入IO ()
程序中时?
谢谢 !
PS。哦,我还发现接收器只能从“上下文”值开始计算,而不是纯值,这是我脑海中出现的另一个问题......