reduce
ve apply
elbette, 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 apply
her zaman mükemmel bir deyimsel olduğunu söyleyebilirim , ancak reduce
eş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.
+
reduce
değ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: reduce
iş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, apply
biraz 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 apply
zaman reduce
gerçekten sizi yavaşlatabilirken bunlardan yararlanmanıza izin verir . Uygulamada ortaya çıkan ikinci senaryonun iyi bir örneği şu şekilde sağlanır str
: StringBuilder
dahili olarak kullanır ve apply
yerine 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) reduce
bilirseniz, dilerseniz o küçültücü gereksiz ek yükü tıraş etmekten çekinmeyin.
sum
haskell'deki gibi yerleşik bir işlevi dahil etmiyorsunuz ? Oldukça yaygın bir operasyon gibi görünüyor.