reduceve applyelbette, değişken-arity durumunda tüm argümanlarını görmesi gereken ilişkisel işlevler için yalnızca eşdeğerdir (döndürülen nihai sonuç açısından). Sonuç açısından eşdeğer olduklarında, bunun applyher zaman mükemmel bir deyimsel olduğunu söyleyebilirim , ancak reduceeşdeğerdir - ve birçok yaygın durumda göz açıp kapayıncaya kadar bir miktar tıraş olabilir. Aşağıda buna inanmak için mantığım var.
+reducedeğişken-arity durumu (2'den fazla argüman) açısından kendisi uygulanmaktadır . Aslında, bu, herhangi bir değişken ariteye, ilişkisel işlev için son derece mantıklı bir "varsayılan" yol gibi görünüyor: reduceişleri hızlandırmak için bazı optimizasyonları gerçekleştirme potansiyeline sahiptir - belki de internal-reduce, yakın zamanda ustada devre dışı bırakılan 1.2 yenilik gibi bir şey olabilir , ancak umarım gelecekte yeniden tanıtılabilir - ki vararg durumunda bunlardan fayda sağlayabilecek her işlevde kopyalamak aptalca olur. Bu tür yaygın durumlarda, applybiraz ek yük getirecektir. (Gerçekten endişelenecek bir şey olmadığını unutmayın.)
Öte yandan, karmaşık bir işlev, içine yerleştirilmek için yeterince genel olmayan bazı optimizasyon fırsatlarından yararlanabilir reduce; o applyzaman reducegerçekten sizi yavaşlatabilirken bunlardan yararlanmanıza izin verir . Uygulamada ortaya çıkan ikinci senaryonun iyi bir örneği şu şekilde sağlanır str: StringBuilderdahili olarak kullanır ve applyyerine kullanımından önemli ölçüde faydalanacaktır reduce.
Yani, applyşüphe duyduğunuzda kullanın derim ; ve bunun size bir şey satın almayacağını reduce(ve bunun çok yakında değişme ihtimalinin düşük olduğunu) reducebilirseniz, dilerseniz o küçültücü gereksiz ek yükü tıraş etmekten çekinmeyin.
sumhaskell'deki gibi yerleşik bir işlevi dahil etmiyorsunuz ? Oldukça yaygın bir operasyon gibi görünüyor.