Bilgi Merkezi
Bundan sıkıldım, bana başka bir şey göstersen?

Fold (higher


In işlevsel , ağılı programlıyor( Veya azaldın) Bir aile bazı düzende bir veri yapı işlem yaptığını işleyen higher-orderini mi. ve Bir dönüş değerine birikir Bu bir başlama değeri hangi aldığını işleyen açılmışın ailesine karşı çıktığı gibi. ve O tekrar tekrara bir fonksiyona bir veri yapısını üretmek için başvurur , bir ağıl iki şeyle tipik olarak ilgilenir: Bir birleştirme fonksiyonu , ve bir veri yapısı , öğelerin tipik olarak bir listesi. Ağıl bazı sistematik yolda fonksiyon kullanmayı düzenleyen verinin birlik öğelerine o zaman gider. Örneğin , biz write

fold( +) [ 1,2,3,4,5]

which 15 olan 1 + 2 + 3 + 4 + 5 ,le sonuçlanacaktı. bu kez + birliğe ilişkin bir operasyondur bu yüzden O nasıl bir parenthesizes ilave olduğu konu ile ilgisi olmayandır. Bir külhanbeyi tahminine , siz + operasyonla listede virgülleri değiştiriyor olduğun gibi ağılın hakkında düşünebilirsiniz.

However , genel durumdaki , iki parametrenin fonksiyonları birisinin, öğe sorunlarının birleşimini gerçekleştirdiği birliğe ilişkin , bu yüzden düzen değildir. Listelerde , bu dış taşımak için iki açık yol var: Geri kalan birleştirmenin sonuçlarıyla ilk öğe birleştirme tarafından hem( Bir hak ağılını çağırdı) Tüm birleştirmenin sonuçları birleştirme tarafından veya fakat son olanla son öğe ,( Sol bir ağılı çağırdı) . hatta Uygulamada , O uygundur ve Sahip ol birinci bir bir hak ağılının durumunda ,ın, birisinin, listenin sonu ne zaman ulaştığını hangi kullandığına değer biçer. , Ve sol bir ağılın durumundaki , listenin ilk öğesiyle birleştiren başlangıçta nedir Bu foldr ve Haskell 'de foldlu tarif ediyor olan denklemlerde görmek için belki daha açıktır. Haskell 'de o ,a dikkat edin[ ] Boş liste , veyi gösterir( X: Xs) Listenin geri kalanının, nerede xs olduğu xla ve başlıyor olan listeni gösterir.

foldr f z[ ] Eğer liste boş olursa = z--( , Sonuç birinci değer zfoldr f zdir X: Xs) = f x( Foldr f z xs) Eğer değil --[ , İlk öğeye f ve geri kalan foldl f z katlamanın sonucuna başvurun ] Eğer liste boş olursa = z--( , Sonuç birinci valuefoldl f zdir X: Xs) = foldl f( F z x) Eğer hemen ilk öğeyle eski birinci değer birleştirmenin yeni birinci değer sonuç --ini yapıyor olan değil , biz recurse , olursak xs --. Tembelin huzurundaki dikkat etmek için önemli şey , veya normal-order değerlendirme , foldrun, hemen listenin geri kalanının üzerinde katlamanın recursive durumuna fın uygulamasına geri dönecek olduğu. , böyle ve Sonucun geri kalanı asla talep edilmez , Eğer f recursive duruma referanssız sonucunun bazı bölümünü üretebilirse recursion o zaman durduracak. Bu sonsuzluk listelerini ameliyat etmek için ağıla kapayan haka izin verir. Karşıtlık tarafından , foldl listenin sonuna ulaşan ona kadar yeni parametrelerle kendini hemen çağırır. Bu kuyruk recursion bir ilmek , fakat hiç ebediyyen sonsuzluk ilgilenmediği gibinin, bir sonsuzluk ilmeğinde -- o recurseyi listeleyeni derlenen verimli olarak olur. Değerlendirin, yeni birinci parametre recursive bağırma yapılan olduktan öncenin, olmamıyor olduğunu değerlendir olana yönelen başka teknik Bunun gibi dillerde sol ağılların durumundanın farkında olan. Bu birisi listenin sonu ulaşınca ekin yığını taşmalarına götürebilir. ve Sonuçlanma deyimini değerlendirmeyi potansiyel olarak kocaman dener Bu sebep için , Bunun gibi diller recursive bağırma yapıyor olmadan öncenin, birinci parametrenin değerlendirmesine hangi mecbur ettiğini katlıyor olan solun bir daha sert değişiğini sık sık sağlar( , Haskell 'de , bu foldl'dur Kesme işareti , belirgin 'prime'e dikkat edin) Veride işleyin. Kütüphaneyi listeleyin. Kuyruk recursion hızıyla birleştirdi , Bunun gibi ağıllar son sonucun tembel değerlendirmesi imkansız veya istenmeyen iken çok verimlidir.

One birinci değer z gibi operasyon fın disk üzerinde askerlerin kimligi yazılı öğesini seçmek sık sık ister. Ne zaman birisi için birinci değer hiçbir birinci değer uygun , örneğin benzemeyince gibinin, sırasıyla son ve listenin ilk öğesini kullanan listenin maksimum öğesini alan bir listenin üzerinde iki parametresinin maksimumunu hesaplayan fonksiyon ağıla kapamak ister. , Foldrun değişikleri ve foldl var Haskell 'de ve birkaç diğer diller , bunlar onların, en az derecede olan öğede işe koyulan başvur olduğu listeler olduğu foldr1 ve foldl1 , birinci bir öğenin otomatik hazırlığı söz etme , ve gerçeği çağırılır.

In plan , hak ve sol ağılı yazılı olabilir:

( Tarifi mümkün( Foldr f z xs) ( Eğer( Geçersiz? Xs) Z( F( Araba xs) ( Foldr f z( Cdr xs) ) ) ) ) ( Tarifi mümkün( Foldl f z xs) ( Eğer( Geçersiz? Xs) Z( Foldl f( F z( Araba xs) ) ( Cdr xs) ) ) )

The C++ standart kalıp kütüphanesi fonksiyon gibi sol ağılı tamamlar" Biriktirin" ( Başlıkta & lt; Nümerik & gt; ) .

baÅŸka approach

Folds bir verinin yapısal bileşenleri değiştirme için bir mekanizma fonksiyonlarla ve düzenli bir yolda değerler düzenlediği gibi görülmüş olabilir. Çok dilde , listeler iki ilkelden biriğilir: Herhangi bir liste hem boş listedir , Hiçi oğunlukla çağırdı , Veya o bizim, bir karşıları çağırdığımız bazı diğer listenin başlangıcına bir öğe ilave etme tarafından , yapan bir listedir. Haskell 'de , karşılar operasyon bir kolon gibi yazılır( : ) , ve plandaki ve diğer pelteklikler , o aldadanı çağırdı. Birisi belirli bir değerle listenin sonunda hiç yer değiştiriyor olduğun gibi bir hak ağılını görebilir. , Ve her bir belirli diğer bir fonksiyonla aldatır Bundan dolayı , birisi bakış bir şeyinin, bundan hoşlandığı bir diyagramı alır: Sol bir ağılın

In durumu , Oluyor olan yapısal değişim , Fakat hala tamamen düzenlidir: Yapılan oldukça daha az doğaldır

These resimler ve hak ağılı visuallyı ayrılılan adlar sevketmenin oldukça hoş bir işini yapar. O hatta açık gerçek o foldru yapar( : ) [ ] Disk üzerinde askerlerin kimligi yazılı fonksiyonu listelerde , mi ve Hiçle hiç aldadan aldadanı değiştiriyor olduğun gibi anythingilizceyi değiştirmeyecek: Sol ağıl diyagramı kolay bir yolu foldl , bir listeyi ters çevirmek için önerir( Fiske( : ) ) [ ] . Parametrelerin, fiske atılmış olanı aldattığı dikkat edin. , İlave etmek için öğe şimdi birleştirme fonksiyonunun hak el parametresidir Bu daha iyi durum-noktadan görmek için sonuç foldr açısından higher-order harita fonksiyonu yazmaktır , Göre hareket et öğeler ,ı aldatır:

map f = foldr( ( : ) . F) [ ]

where devir( . ) Bir operatör fonksiyon kompozisyonunu gösteriyor mu. Şeyler bakmanın

This yolu diğer cebirsel veri yapılarında işleyen ağıl-gibi tasarlamaya basit bir yolu sağlar , Ağaçların çeşitli türlerinden hoşlanır. Recursivelyin, fonksiyonlar sağlanan datatypenin inşaatçilerini değiştirdiği bir yazılı emirler bir fonksiyon. , Ve tipin herhangi bir sabit değerleri değerleri sağladı Bunun gibi bir fonksiyon bir catamorphism gibi genellikle başvurulur.

dış links

fold (higher-order function) ile ilgili Anahtar Kelimeler :the foldl foldr value case with and result initial are left function that right one element list fold cons which
Bu makale Wikipedia' dan çarpma olup GNU FDL lisansı altındadır. Bu yazıyı yazan arkadaşlar buradadır.
Bir Şey Öğren bir Ferruh Mavituna aksiyonudur ve aktivist bir Wiki forkudur.

Wußten Sie das? - Lernet was