При выполнении действия IO, определенного someFun <$> (a :: IO ()) <$> (b :: IO ())
, выполняется ли выполнение действий a
и b
? То есть, могу ли я рассчитывать на то, что a
выполняется до b
?
Для GHC я вижу, что IO реализовано с использованием 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]
Спасибо!