SORU
8 HAZİRAN 2011, ÇARŞAMBA


Özyinelemeli olarak tanımlanan bir anlayış listesi (zipWith açısından yalan)

Haskell öğreniyorum ve aşağıdaki kodu rastladım:

fibs = 0 : 1 : zipWith ( ) fibs (tail fibs)

sorun biraz, nasıl çalışır bakımından ayrıştırma yaşıyorum. Çok temiz, hiçbir şey daha fazla ihtiyacı olduğunu anlıyorum, ama Haskell "yazdığımda" yalan: . doldurmak için nasıl yönettiğini anlamak istiyorum

take 50 fibs

Herhangi bir yardım?

Teşekkürler!

CEVAP
8 HAZİRAN 2011, ÇARŞAMBA


Uygulamanın nasıl çalıştığı hakkında bir açıklama biraz veririm. İlk olarak, Haskell bir şey onun değerleri için thunk adı kullanan anlamış olmalısınız. Bir thunk temelde henüz -- 0 bağımsız değişkenlerin bir fonksiyonu olarak düşün hesaplanan bir değerdir. Haskell istediği zaman, (veya kısmen uyumlu) thunk, gerçek bir değere çevirmeyi değerlendirebilir. Sadece eğerkısmenbir thunk değerlendirir, sonra elde edilen değer daha thunk.

Örneğin, ifade göz önünde bulundurun:

(2   3, 4)

Sıradan bir dil, bu değer ** 11, ama Haskell olarak hafızada saklanır, (<thunk 2 3>, 4) olarak saklanır. Eğer bu başlığın ikinci unsuru için sorarsanız, "4", olmadan hiç 2 ve 3 ekleme beraber. o size söyleyecektir Eğer bu başlığın ilk öğenin sorarsan thunk değerlendirir ve anlar 5.

Özyinelemeli çünkü yalan, biraz daha karmaşık, ama aynı fikri kullanabiliriz. fibs herhangi bir argüman alır, çünkü, Haskell kalıcı önemli olduğunu keşfetti -- tüm liste öğeleri saklar.

fibs = 0 : 1 : zipWith ( ) fibs (tail fibs)

Üç ifadeler Haskell mevcut bilgi görselleştirmek için yardımcı olur: fibs, tail fibs zipWith ( ) fibs (tail fibs). Aşağıdaki bilmek: Haskell başlar varsayacağız

fibs                         = 0 : 1 : <thunk>
tail fibs                    = 1 : <thunk>
zipWith ( ) fibs (tail fibs) = <thunk>

2. satır ilk kişi olduğunu not bıraktı değiştirdi, ve 3. satırın ilk iki satır toplanır.

take 2 fibs [0, 1] alırsınız. Haskell daha yukarıda bu bulmak için değerlendirmek gerek yok.

take 3 fibs ve Haskell, 0 ve 1, ve için ihtiyaçları olduğunu fark sonra alacakkısmen değerlendirinthunk. Tam ilk iki satır -- sum gerekiyor zipWith ( ) fibs (tail fibs) değerlendirmek amacıyla, tam olarak bunu yapamaz, ama olabilirbaşlarilk iki satır toplamı:

fibs                         = 0 : 1 : 1: <thunk>
tail fibs                    = 1 : 1 : <thunk>
zipWith ( ) fibs (tail fibs) = 1 : <thunk>

Not doldurdum "1" satır 3, ve otomatik olarak ortaya çıkan, ilk ve ikinci sıra, bu yana üç satır paylaşan aynı thunk (bence bir işaretçi var yazılmış). Ve değerlendirme bitirmek vermedi, yeni bir thunk içeren yarattıdinlenmeliste, bu şimdiye kadar yapılması gerekirdi.

take 3 fibs yapılır çünkü, gerçi ihtiyacım yok,: [0, 1, 1]. Ama şimdi, take 50 fibs; Haskell zaten 0, 1 ve 1 hatırlar istemek demek. Ama devam etmek gerekiyor. İlk iki satır toplamak devam ediyor:

fibs                         = 0 : 1 : 1 : 2 : <thunk>
tail fibs                    = 1 : 1 : 2 : <thunk>
zipWith ( ) fibs (tail fibs) = 1 : 2 : <thunk>

...

fibs                         = 0 : 1 : 1 : 2 : 3 : <thunk>
tail fibs                    = 1 : 1 : 2 : 3 : <thunk>
zipWith ( ) fibs (tail fibs) = 1 : 2 : 3 : <thunk>

Ve bu yüzden, 3 satır 48 sütun dolu kadar, ve böylece ilk 50 sayı yaptı. Haskell, ihtiyacı kadar değerlendirir ve sonsuz "" her zamankinden daha fazla ihtiyacı var diye. thunk bir nesne olarak sıra sonuna bırakır

Eğer daha sonra tekrar değerlendirmek olmaz Haskell take 25 fibs, isterseniz sadece önceden hesaplanmış olan listedeki ilk 25 numara alacak unutmayın.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caroline Martin

    Caroline Mar

    19 EYLÜL 2008
  • Drakinen

    Drakinen

    1 EYLÜL 2008
  • TWiT Netcast Network

    TWiT Netcast

    27 EKİM 2005