Haskell – 應用程式中的效果順序確定性?
$> (b :: IO()),是執行a和b操作的順序嗎?也就是說,我可以指望在b之前執行a.
對於GHC,我可以看到IO是使用State實現的,也可以看到ofollow,noindex" target="_blank">here 是一個應用例項,但找不到實際例項宣告的來源.通過州實施表明,不同的IO效應需要是順序的,但並不是必須的.
在GHCi玩耍似乎應用保留效果順序,但是有一些普遍的保證,還是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]
謝謝!
肯定是肯定的.對於任何具體的例項,它總是會做同樣的事情.然而,沒有任何固有的原因從左到右從左到右選擇效果的順序.
不過從
the documentation forApplicative
:
Iff
is also aMonad
, it should satisfypure
=return
and(<*>)
=ap
(which implies thatpure
and<*>
satisfy the applicative functor laws).
ap的定義是這個,來自Control.Monad:
ap :: (Monad m) => m (a -> b) -> m a -> m b ap =liftM2 id
而LiftM2是以明顯的方式定義的:
liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) }
這意味著,對於任何一個Monad以及一個應用程式的函子,預期(通過規範,由於這不能在程式碼中執行),該應用程式將從左到右工作,以便liftM2中的do塊與liftA2 fxy = f $相同. x *年.
由於上述原因,即使對於沒有相應的Monad的應用例項,按照慣例,效果通常是從左到右排列的.
更廣泛地說,由於應用計算的結構必然與“效應”無關,您通常可以獨立於應用效果如何排序來分析程式的含義.例如,如果[]的例項被更改為從右到左的順序,則使用它的任何程式碼將給出相同的結果,只是與不同順序的列表元素.
http://stackoverflow.com/questions/14259195/haskell-is-effect-order-deterministic-in-case-of-applicative