で定義されたIOアクションを実行する場合someFun <$> (a :: IO ()) <$> (b :: IO ())
、a
およびb
アクションの実行は順序付けられていますか?つまり、a
以前に実行されたものを信頼できb
ますか?
GHCの場合、IOがStateを使用して実装されていることがわかります。また、これが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]
ありがとう!