Haskell'de basit bir program yazmaya çalışıyorum. Temel olarak iki kabuk komutunu paralel olarak çalıştırmalıdır.IO monad ile Mantıksal ve Kesinlik
import System.Cmd
import System.Exit
import Control.Monad
exitCodeToBool ExitSuccess = True
exitCodeToBool (ExitFailure _) = False
run :: String -> IO Bool
run = (fmap exitCodeToBool) . system
main = liftM2 (&&) (run "foo") (run "bar")
Ama komutu "foo" ExitFailure döner ve ben çalıştırmak için asla "bar" bekliyoruz: İşte kodudur. Durum bu değil! Her ikisi de çalışır ve her ikisi de konsolda hataları gösterir. Aynı zamanda
False && (all (/= 0) [1..])
de
de mükemmel değerlendirir Bu ikinci argüman hesaplanmamış demektir. Uygulamamdaki sistem komutlarıyla aynı şeyi nasıl yaparım?
'liftM2' tanımına bakın. İstediğiniz (monadic) birliği olan '(&&)' nin monadik bir versiyonuna ihtiyacınız var. – augustss
Komutları paralel olarak çalıştırmak ve sadece "foo" başarılı olursa "bar" ı çalıştırmak istediğinizi söylüyorsunuz. Hiç bir anlamı yok. Karar ver, paralel mi sıralı mı istiyorsun? – remdezx