Podczas wykonywania akcji zamówienia reklamowego zdefiniowanej przez someFun <$> (a :: IO()) <$> (b :: IO())
, jest wykonywane wykonanie akcji a
i b
? To znaczy, czy mogę liczyć na to, że a
jest wykonywane przed b
?Haskell - Czy deterministyczny porządek efektów w przypadku Wnioskodawcy?
Dla GHC, widzę IO zaimplementowane przy użyciu stanu, a także zobacz here, że jest to instancja aplikacji, ale nie może znaleźć źródła deklaracji rzeczywistej instancji. Implementacja za pośrednictwem państwa sugeruje, że różne efekty IO muszą być sekwencyjne, ale nie jest konieczne określenie ich kolejności.
Zabawa w GHCi wydaje się, że Appliative zachowuje kolejność efektów, ale czy jest to jakaś gwarancja uniwersalna, czy GHC specyficzna? Byłbym zainteresowany szczegółami.
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]
Dzięki!
Zgaduję, że ten wpis zawiera przydatne informacje, ale muszę je jeszcze przetrawić: http://pchiusano.blogspot.hu/2011/07/do-side-effects-really-need-total-order.html – ron
Zobacz http : //hackage.haskell.org/packages/archive/transformers/0.3.0.0/doc/html/Control-Applicative-Backwards.html, który jest transformatorem aplikacyjnym odwracającym kolejność efektów. –