Haskell'deki rasgele hesaplamaları Control.Monad.Random
kütüphanesi kullanarak bir zaman aşımıyla değerlendirmek istiyorum. gayet güzel şu işleri:Haskell - Rand monadındaki zaman aşımı hesaplamaları
ghci> import System.Timeout
ghci> import Control.Monad.Random
ghci> timeout 1000 . evalRandIO $ getRandomR (True, False)
Just True
Ancak, bu yaklaşım biz (alta yani değerlendirir) sonlandırır asla tip Rand StdGen a
bir hesaplama varsa çalışmak görünmüyor. Örneğin:
ghci> let f = f :: Rand StdGen Bool
ghci> timeout 1000 $ evalRandIO f
Just
GHCI baskılar "Sadece" ve ardından süresiz f
değerlendirmek için çalışıyor asmak. Haskell çalışma zamanı hakkında daha fazla şey bilen biri, bunun neden olduğunu açıklamaktan ve etrafından nasıl geçeceğimi açıklayabilir mi? Tahminim, evalRandIO f
ifadesinin WHNF'ye göre değerlendirilmiş olması ve timeout 10
hesaplamanın sonlanacağını düşünmesidir, ancak gerçekten hiçbir fikrim yok. Eğer
> Just x <- timeout 1000 $ evalRandIO f
> :t x
x :: Bool
> x
Interrupted.
kendisi yani o WHNF ulaşıyor tamamlamakta hesaplama böyle bir şey yapmak olsaydı
teşekkür ederiz: Başka muhtemelen daha basit bir örnek sadece gibi
$!
operatörünü kullanmak olurdu! Seq/deepseq ve Haskell çalışma zamanı hakkında çok şey öğreneceğim. – user3873438@ user3873438 Adil olmak gerekirse, kendimi bulmak için bir GHCi oturumu yüklemem gerekiyordu. Tembellik bazı ilginç sorunlara neden olur, ancak çoğu zaman bunu düşünmek zorunda bile kalmazsınız. Çoğunlukla, belirli bir düzende, katılık konusunda endişelenmeye başlamanız gereken şeylere ihtiyaç duyduğunuz problemlere ulaştığınızda, bu durumda, 'zaman aşımı 1000' sonuna ulaşılmadan önce evalRandIO f'nin gerçekleşmesini istediniz. Böyle bir ilişkiyle, derinlikle açık olmak önemlidir, bu, “deepseq” ve “$!” Nin ne olduğudır. – bheklilr
Ayrıca uzay sızıntıları ve paralellik için tembelliği endişelenmeniz gerekir. – PyRulez