reducevà applytấ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 applynó luôn luôn hoàn toàn thành ngữ, trong khi reducetươ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 reducecho 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: reducecó 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, applysẽ 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 đó applysẽ cho phép bạn tận dụng những lợi ích đó trong khi reducethự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 StringBuildernội bộ và sẽ được hưởng lợi đáng kể từ việc sử dụng applychứ không phải reduce.
Vì vậy, tôi muốn sử dụng applykhi 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.
sumchức năng tích hợp như trong haskell? Có vẻ như một hoạt động khá phổ biến.