reduce
và apply
tất nhiên chỉ tương đương (về kết quả cuối cùng được trả về) cho các hàm kết hợp cần xem tất cả các đối số của chúng trong trường hợp biến thiên. Khi chúng tương đương với kết quả, tôi muốn nói rằng apply
nó luôn luôn hoàn toàn thành ngữ, trong khi reduce
tương đương - và có thể loại bỏ một phần của một cái chớp mắt - trong rất nhiều trường hợp phổ biến. Điều gì sau đây là lý do của tôi để tin vào điều này.
+
được thực hiện theo các điều khoản reduce
cho trường hợp biến thiên (hơn 2 đối số). Thật vậy, đây có vẻ như là một cách "mặc định" vô cùng hợp lý để sử dụng cho bất kỳ chức năng kết hợp, biến đổi nào: reduce
có khả năng thực hiện một số tối ưu hóa để tăng tốc mọi thứ - có lẽ thông qua một cái gì đó như internal-reduce
, một tính mới 1,2 gần đây đã bị vô hiệu hóa trong chủ, nhưng hy vọng sẽ được giới thiệu lại trong tương lai - điều sẽ thật ngớ ngẩn khi sao chép trong mọi chức năng có thể có lợi từ chúng trong trường hợp vararg. Trong trường hợp phổ biến như vậy, apply
sẽ chỉ thêm một chút chi phí. (Lưu ý không có gì phải thực sự lo lắng.)
Mặt khác, một chức năng phức tạp có thể tận dụng một số cơ hội tối ưu hóa mà không đủ chung để tích hợp vào reduce
; sau đó apply
sẽ cho phép bạn tận dụng những lợi ích đó trong khi reduce
thực sự có thể làm bạn chậm lại. Một ví dụ điển hình của kịch bản sau xảy ra trong thực tế được cung cấp bởi str
: nó sử dụng StringBuilder
nội bộ và sẽ được hưởng lợi đáng kể từ việc sử dụng apply
chứ không phải reduce
.
Vì vậy, tôi muốn sử dụng apply
khi nghi ngờ; và nếu bạn tình cờ biết rằng nó sẽ không mua cho bạn bất cứ thứ gì reduce
(và điều này sẽ không thể thay đổi sớm), hãy thoải mái sử dụng reduce
để loại bỏ chi phí không cần thiết đó nếu bạn cảm thấy như vậy.
sum
chức năng tích hợp như trong haskell? Có vẻ như một hoạt động khá phổ biến.