SORU
14 HAZİRAN 2009, Pazar


Ünlem işareti Haskell bildiriminde anlamı nedir?

Haskell sürücü için gerçek bir proje kullanarak öğrenmeye çalışıyorum olarak aşağıdaki tanımı buldum. Her argüman önünde ünlem işareti ne anlama geldiğini bilmiyorum ve benim kitap lafı bile görünmüyordu.

data MidiMessage = MidiMessage !Int !MidiMessage

CEVAP
14 HAZİRAN 2009, Pazar


Katılık bir beyan. Temel olarak, "zayıf normal kafa formun veri yapısını, değer olduğunda" yarattı. ne için muayene olmanız gerektiği anlamına gelir Hadi bunun ne anlama geldiğini görmek için bir örnek bak:

data Foo = Foo Int Int !Int !(Maybe Int)

f = Foo (2 2) (3 3) (4 4) (Just (5 5))

Değerlendirildiğinde f yukarıda döndürür işlevi "": bu, onun değerini anlamaya yürütmek için kodu thunk. Bu noktada, bir Foo henüz, sadece kod yok.

Ama bir noktada birileri muhtemelen bir desen eşleşmesi ile içine bakmak için deneyebilirsiniz:

case f of
     Foo 0 _ _ _ -> "first arg is zero"
     _           -> "first arge is something else"

Bu ihtiyacı ne için yeterli kod çalıştırmak için gidiyor, ve artık yok. Dört parametre ile bir Foo mevcut olmadan içine bakamazsın çünkü) oluşturur. Test ediyoruz beri ilk kez bir maç değil biz fark nerede 4, Her şekilde değerlendirmemiz gerekiyor.

İkinci test edemiyoruz çünkü değerlendirilmek gerek yok. Böylece, 6 bellek konumunda depolanan olmaktan ziyade, sadece olası bir sonraki değerlendirme, (3 3) kodunu bize gelecek. Eğer birisi bakarsa sadece 6 dönüşecek.

Üçüncü parametre, ancak önünde ! vardır, kesinlikle değerlendirilir: (4 4) yürütülür ve 8 bellek konumunda depolanır.

Dördüncü parametre de kesinlikle değerlendirilir. Ama biraz ustalık ister: tam olarak değil, ama zayıf sadece normal kafa şeklinde. değerlendirme yapıyoruz Bu biz Nothing Just bir şey olup olmadığını anlamaya, ve, ama daha ileri gidip saklamak anlamına gelir. Biz 16 ** ama aslında 17**, thunk içinde unevaluated bırakarak saklamak anlamına gelir. Bu tüm bu etkileri oldukça bu soru kapsamı dışına gerçi bilmek önemlidir,.

Eğer BangPatterns dil uzatma etkinleştirirseniz aynı şekilde işlev bağımsız değişkenleri açıklama:

f x !y = x*y

f (1 1) (2 2) thunk (1 1)*4 dönecektir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bogdan Gabriel

    Bogdan Gabri

    5 Aralık 2006
  • Disney Pets and Animals

    Disney Pets

    29 ŞUBAT 2012
  • TheOtherMau5

    TheOtherMau5

    6 Mart 2012