【发布时间】:2013-01-10 13:36:43
【问题描述】:
在执行someFun <$> (a :: IO ()) <$> (b :: IO ())定义的IO动作时,a和b动作的执行是否有序?也就是说,我可以指望a 在b 之前执行吗?
对于 GHC,我可以看到 IO 是使用 State 实现的,也可以看到 here 它是一个 Applicative 实例,但找不到实际实例声明的来源。通过 State 实现表明不同的 IO 效果需要是顺序的,但不需要定义它们的顺序。
在 GHCi 中玩耍似乎 Appliative 保留了效果顺序,但这是一些普遍的保证,还是 GHC 特定的?我会对细节感兴趣。
import System.Time
import Control.Concurrent
import Data.Traversable
let prec (TOD a b) = b
fmap (map prec) (sequenceA $ replicate 5 (threadDelay 1000 >> getClockTime))
[641934000000,642934000000,643934000000,644934000000,645934000000]
谢谢!
【问题讨论】:
-
我猜这篇文章包含有用的信息,但我仍然需要消化它:pchiusano.blogspot.hu/2011/07/…
-
见hackage.haskell.org/packages/archive/transformers/0.3.0.0/doc/…,这是一个应用变换器,可以颠倒效果的顺序。
标签: haskell applicative