GHCi bağlamaları izin thunk farklı davranış anlama söz konusu
Paralel ve eşzamanlı hakkında Simon Marlow kitabından bazı örnekler ile oynuyorum programlama ve gerçekten anlamıyorum ilginç bir davranış karşısında Haskell tökezledi. Bu gerçekten DZD iç işleyişini anlamaya çalışıyorum.
Hadi ÇOĞALTMA şunları söyleyebilirim:
λ» let x = 1 2 :: Int
λ» let z = (x,x)
λ» :sprint x
x = _
λ» :sprint z
z = (_,_)
λ» seq x ()
()
λ» :sprint z
z = (3,3)
Tamam, bu o z zaten WHNF için değerlendirilen hariç beklediğim gibi. Bakalım benzer bir program yazıp dosyaya koyup:
module Thunk where
import Debug.Trace
x :: Int
x = trace "add" $ 1 2
z :: (Int,Int)
z = (x,x)
Ve etrafında GHCi içinde keman:
λ» :sprint x
x = _
λ» :sprint z
z = _
λ» seq x ()
add
()
λ» :sprint z
z = _
λ» seq z ()
()
λ» z
(3,3)
Bu biraz daha farklı davranır: z
önceden WHNF için değerlendirilir. Benim sorum:
Neden z
bir dosyadan tanımı yüklerken let z = (x,x)
ama değil ne zaman ÇOĞALTMA WHNF olarak değerlendirilir. Benim şüphe olduğunu
desen bağlama ile ilgili bir şey var ama açıklama (belki de tümüyle yanlış yapıyorum) için nereye bakmam gerektiğini bilmiyorum. Bu şekilde dosyadaki örnek gibi davranmasını beklerdim.
Bunun neden olduğu ile ilgili herhangi bir öneriye ya da kısa bir açıklama?
CEVAP
(,)
yapıcı olduğundan, fark Haskell şimdi anlamları için fark (:sprint
iç thunk uygulama ayrıntıları için erişim sağlar o yüzden sayılmaz.) Bu hangi iyileştirmeleri ve ticaret-off DZD farklı pozisyonlarda (x,x)
derleme bir soru. Başkası bu durumlarda kesin nedeni bilmiyor olabilir.
&; kesme şu anda hit olacak değil". Ka...
Neden &dizesi bir nokta olduğunda quot...
Neden Java bize bir isim dosya adından...
Çekirdek Veri ve iOS 7: kalıcı mağazan...
c neden initializer_list davranış için...