Ana içeriğe geç
Programlama

Haskell blogu foldl ve foldr katlama işlevlerinin farklarını açıkladı

Öne çıkanlar

  • Her iki katlama işlevi de listeleri soldan sağa doğru tarar; temel fark birleşme özelliğinden kaynaklanır.
  • Standart foldl Haskell içinde büyük thunk ağaçları kurduğu için yerine katı çalışan foldl' önerilir.
  • foldr işlevi ikinci argümanda tembellik sağladığında sonsuz listeleri başarıyla işleyebilir.

Haskell resmi blogu, Alexis King tarafından kaleme alınan ve foldl ile foldr işlevleri arasındaki yapısal ve anlamsal farkları ele alan teknik kılavuzu yayımladı. Açıklamada, yaygın inanışın aksine her iki işlevin de listeleri soldan sağa doğru taradığı, temel farkın yön değil birleşme özelliği (associativity) olduğu belirtildi. foldl sol-birleşimli, foldr ise sağ-birleşimli ifadeler üretiyor.

Tembel (lazy) değerlendirme modeline sahip dillerde bu birleşme farkı bellek ve çalışma performansını doğrudan etkiliyor. Haskell içinde standart foldl kullanımı, ara adımları değerlendirmeden büyük thunk zincirleri oluşturarak sabit bellek avantajını yitiriyor ve doğrusal bellek tüketimine yol açıyor. Bu sorunu aşmak amacıyla toplayıcıyı her adımda zorlayarak sabit alanda çalışan foldl' türevinin tercih edilmesi gerektiği aktarılıyor.

Buna karşılık foldr, ikinci argümanı tembel olan işlevlerle kullanıldığında zayıf başlık normal formuna (WHNF) ulaşarak hesaplamayı talep anına kadar erteliyor. Bu nitelik, foldr işlevinin sonsuz listelerle çalışabilmesini ve çıktının tamamı tüketilmediğinde işlem tasarrufu sağlamasını mümkün kılıyor. Kılavuz, listeler üzerinde katı işlemler için foldl', tembel akışlar içinse foldr kullanımını öneriyor.

Kaynak

Bu özet yapay zekâ ile hazırlanmıştır; ayrıntılar ve doğrulama için orijinal kaynağa başvurun.