SORU
13 EYLÜL 2011, Salı


Sol ve Sonsuz bir liste üzerinde Sağ Katlanır

Learn You A Haskell (Harika bir kitap ımo, aşağılandığını): aşağıdaki pasaj ile ilgili sorunlar var

Çok büyük bir fark değil kıvrımlar sol olanları yok ise sonsuz listeleri üzerinde çalışmak! Koy bir noktada sonsuz bir liste alıp katlarsan açıkça, sağdan, sonunda listenin başına ulaşamazsın. Bir noktada sonsuz bir liste alıp katlamak için çalışırsanız ancak, sol kadar, hiç sona ulaşacaksın!

Ben sadece bunu alamadım. Eğer alırsan sonsuz bir liste ve denemek kat yukarı doğru o zaman başlangıç noktasında sonsuz olan sadece yok oluyor (Eğer herkesin bildiği bir dil nereye yapabilirsin bunu söyle :p). En azından, orada Haskell foldr çünkü Haskell uygulamasına göre başlaman lazım ve foldl listesinde katlanır başlamak gerekir nerede belirleyen bir argüman yok.

Ben ki katılıyorum alıntı ıff foldr ve foldl aldı değişkenleri tespit neresinde liste gerektiğini başla katlanır, çünkü anlaşılıyor ki eğer alırsan sonsuz bir liste ve başlangıç katlanır sağdan tanımlanmış bir dizinsonunda, bir sol ile başlayıp önemli değil ise kat sonlandırmak; sonsuz doğru katlanır olacaksın. Ancak foldr ve foldlyokbu argüman alır ve bu teklifi hiç mantıklı değil. Haskell, hem de bir sol ve bir sağ, sonsuz bir liste kat katsonlandırılacak.

Benim anladığım doğru mu yoksa yanlış mı düşünüyorum?

CEVAP
13 EYLÜL 2011, Salı


Burada önemli olan, tembellik. Eğer katlanır liste için kullandığınız işlev sıkı ise, o zaman ne de bir sağ bir sol kat kat, sonsuz bir liste vermiş sonlandırılacak.

Prelude> foldr ( ) 0 [1..]
^CInterrupted.

Daha az sıkı bir fonksiyon katlanır çalışırsanız ancak, sonlandırıcı bir sonuç alabilirsiniz.

Prelude> foldr (\x y -> x) 0 [1..]
1

Hatta sonsuz bir veri yapısı olan bir sonuç alabilirsiniz, bir anlamda sonlandırmak değil iken, hala tembel tüketilen bir sonuç üretmek mümkün.

Prelude> take 10 $ foldr (:) [] [1..]
[1,2,3,4,5,6,7,8,9,10]

Ancak, bu asla dış işlev çağrısı değerlendirmek mümkün olacak gibi foldl,, tembel ya da değil ile çalışmaz.

Prelude> foldl (flip (:)) [] [1..]
^CInterrupted.
Prelude> foldl (\x y -> y) 0 [1..]
^CInterrupted.

Unutmayın en önemli fark arasında bir sol ve bir sağ kat değil sırayla hangi listesidir geçilen, her zaman soldan sağa doğru, ama oldukça nasıl elde edilen işlev uygulamaları iç içe geçmiş.

  • İç içe oldukları foldr,""

    foldr f y (x:xs) = f x (foldr f y xs)
    

    Burada, ilk yineleme f dış uygulama neden olur. Böylece, f ikinci argüman da her zaman değerlendirilir, böylece tembel olmak için fırsat var, ya da ikinci argüman zorlamadan bir veri yapısı bir kısmını üretebilir.

  • İç içe oldukları foldl ile "dışarıda"

    foldl f y (x:xs) = foldl f (f x y) xs
    

    Burada yapabileceğimiz bir şey var mi değerlendirmek kadar ulaştı dıştaki uygulama f, biz asla ulaşmak durumunda sonsuz bir liste, ne olursa olsun, ister f katı ya da değil.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • InsideBlackBerry

    InsideBlackB

    14 Aralık 2009
  • ShoSho

    ShoSho

    20 Ocak 2010
  • whiteboy7thst

    whiteboy7ths

    1 Temmuz 2009