在平行&并发的Haskell书,http://chimera.labs.oreilly.com/books/1230000000929/ch09.html#sec_timeout,为什么fmap Just m
不会立即返回一个thunk(违背时间限制的目的)?
或者IO
某些内容是特殊内容而fmap
总是强制结果?这会让我感到惊讶,因为monad-par
包使用NFData
并强制避免这种行为AFAIK。
我肯定会错过一些东西。请赐教。
答案 0 :(得分:4)
在这个答案中,我使用“计算”这个词来描述有效的,与环境相互作用,执行IO动作的一部分。术语各不相同。
给定IO计算act :: IO a
,计算fmap Just act
是一个计算(运行时)运行整个计算act
,然后将Just应用于结果。
它不会立即返回一个thunk。要做到这一点,它必须将计算act
推迟到thunk中,并且计算不能放入thunk中,只能放入计算中。 Thunk只包含纯粹的评估,这正是它们工作的原因 - 我们知道推迟评估是可以的,因为我们知道在执行评估时无关紧要,答案仍然是相同的。计算的执行并不是这样,计算可以与外部世界交互,并且可以根据运行时的环境返回不同的答案。
原语(可以说是“语言破坏”原语)unsafePerformIO
和unsafeInterleaveIO
允许你打破前一段中的规则并将IO计算埋入thunk中,这偶尔会是你真正的想要并经常是一个可怕的,可怕的想法。