fmap是否严格适用于IO?

时间:2014-02-28 12:53:27

标签: haskell io lazy-evaluation

在平行&并发的Haskell书,http://chimera.labs.oreilly.com/books/1230000000929/ch09.html#sec_timeout,为什么fmap Just m不会立即返回一个thunk(违背时间限制的目的)?

或者IO某些内容是特殊内容而fmap总是强制结果?这会让我感到惊讶,因为monad-par包使用NFData并强制避免这种行为AFAIK。

我肯定会错过一些东西。请赐教。

1 个答案:

答案 0 :(得分:4)

在这个答案中,我使用“计算”​​这个词来描述有效的,与环境相互作用,执行IO动作的一部分。术语各不相同。

给定IO计算act :: IO a,计算fmap Just act是一个计算(运行时)运行整个计算act,然后将Just应用于结果。

它不会立即返回一个thunk。要做到这一点,它必须将计算act推迟到thunk中,并且计算不能放入thunk中,只能放入计算中。 Thunk只包含纯粹的评估,这正是它们工作的原因 - 我们知道推迟评估是可以的,因为我们知道在执行评估时无关紧要,答案仍然是相同的。计算的执行并不是这样,计算可以与外部世界交互,并且可以根据运行时的环境返回不同的答案。

原语(可以说是“语言破坏”原语)unsafePerformIOunsafeInterleaveIO允许你打破前一段中的规则并将IO计算埋入thunk中,这偶尔会是你真正的想要并经常是一个可怕的,可怕的想法。