SORU
15 Temmuz 2014, Salı


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
3 Mart 2015, Salı


(,) 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Abe Olandres

    Abe Olandres

    16 EYLÜL 2006
  • Elefant Traks

    Elefant Trak

    5 HAZİRAN 2007
  • listedabive

    listedabive

    30 Ocak 2007