Khi thực hiện hành động IO được xác định bởi someFun <$> (a :: IO()) <$> (b :: IO())
, việc thực thi các hành động a
và b
có được yêu cầu không? Tức là, tôi có thể dựa vào số a
đó được thực thi trước b
không?Haskell - Có phải xác định thứ tự có hiệu lực trong trường hợp Áp dụng không?
Đối với GHC, tôi có thể thấy IO được thực hiện bằng cách sử dụng trạng thái, và cũng xem here rằng nó là một thể hiện áp dụng, nhưng không thể tìm thấy nguồn gốc của khai báo cá thể thực tế. Việc triển khai thực hiện thông qua Nhà nước cho thấy rằng các hiệu ứng IO khác nhau cần phải được tuần tự, nhưng không cần thiết xác định thứ tự của chúng.
Chơi xung quanh trong GHCi có vẻ như Appliative vẫn giữ lại trật tự hiệu lực, nhưng đó là một số đảm bảo phổ quát, hoặc GHC cụ thể? Tôi sẽ quan tâm đến chi tiết.
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]
Cảm ơn!
Tôi đoán bài đăng này chứa thông tin hữu ích nhưng tôi vẫn phải tiêu hóa nó: http://pchiusano.blogspot.hu/2011/07/do-side-effects-really-need-total-order.html – ron
Xem http : //hackage.haskell.org/packages/archive/transformers/0.3.0.0/doc/html/Control-Applicative-Backwards.html, là một biến áp ứng dụng đảo ngược thứ tự các hiệu ứng. –