reducedan applytentu 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 applyselalu sangat idiomatis, sementara reduceitu 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 reducekasus variabel-arity (lebih dari 2 argumen). Memang, ini sepertinya cara "default" yang sangat masuk akal untuk dilakukan untuk variabel-arity, fungsi asosiatif: reducememiliki 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, applyhanya 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 applyakan membiarkan Anda mengambil keuntungan dari mereka sementara reducemungkin sebenarnya memperlambat Anda. Contoh yang baik dari skenario terakhir yang terjadi dalam praktik disediakan oleh str: ia menggunakan StringBuilderinternal dan akan mendapat manfaat secara signifikan dari penggunaan applydaripada reduce.
Jadi, saya akan mengatakan gunakan applysaat ragu; dan jika Anda tahu bahwa itu tidak membuat Anda kesal reduce(dan bahwa ini tidak mungkin berubah segera), jangan ragu reduceuntuk mencukur habisnya biaya tambahan yang tidak perlu jika Anda menginginkannya.
sumfungsi bawaan seperti di haskell? Sepertinya operasi yang sangat umum.