reduce
dan apply
tentu saja hanya setara (dalam hal hasil akhir dikembalikan) untuk fungsi asosiatif yang perlu melihat semua argumen mereka dalam kasus variabel-arity. Ketika mereka setara hasil-bijaksana, saya akan mengatakan itu apply
selalu sangat idiomatis, sementara reduce
itu setara - dan mungkin memangkas sebagian dari sekejap mata - dalam banyak kasus umum. Berikut ini adalah alasan saya untuk percaya ini.
+
itu sendiri diimplementasikan dalam hal reduce
kasus variabel-arity (lebih dari 2 argumen). Memang, ini sepertinya cara "default" yang sangat masuk akal untuk dilakukan untuk variabel-arity, fungsi asosiatif: reduce
memiliki potensi untuk melakukan beberapa optimisasi untuk mempercepat segalanya - mungkin melalui sesuatu seperti internal-reduce
, 1,2 kebaruan yang baru saja dinonaktifkan di master, tetapi mudah-mudahan akan diperkenalkan kembali di masa depan - yang konyol untuk mereplikasi di setiap fungsi yang mungkin mendapat manfaat dari mereka dalam kasus vararg. Dalam kasus umum seperti itu, apply
hanya akan menambah sedikit overhead. (Perhatikan bahwa tidak ada yang perlu dikhawatirkan.)
Di sisi lain, fungsi yang kompleks mungkin mengambil keuntungan dari beberapa peluang optimisasi yang tidak cukup umum untuk dibangun reduce
; maka apply
akan membiarkan Anda mengambil keuntungan dari mereka sementara reduce
mungkin sebenarnya memperlambat Anda. Contoh yang baik dari skenario terakhir yang terjadi dalam praktik disediakan oleh str
: ia menggunakan StringBuilder
internal dan akan mendapat manfaat secara signifikan dari penggunaan apply
daripada reduce
.
Jadi, saya akan mengatakan gunakan apply
saat ragu; dan jika Anda tahu bahwa itu tidak membuat Anda kesal reduce
(dan bahwa ini tidak mungkin berubah segera), jangan ragu reduce
untuk mencukur habisnya biaya tambahan yang tidak perlu jika Anda menginginkannya.
sum
fungsi bawaan seperti di haskell? Sepertinya operasi yang sangat umum.