Một phiên bản sửa đổi nhẹ của reduce
đã được giới thiệu với reducers, clojure.core.reducers/reduce
(viết tắt r/reduce
):Mục đích của clojure.core.reducers/reduce là gì?
(defn reduce
([f coll]
(reduce f (f) coll))
([f init coll]
(if (instance? java.util.Map coll)
(clojure.core.protocols/kv-reduce coll f init)
(clojure.core.protocols/coll-reduce coll f init))))
r/reduce
khác với anh chị em cốt lõi của nó chỉ ở chỗ nó sử dụng (f)
như giá trị ban đầu khi không được cung cấp, và nó đại biểu tới lõi reduce-kv
cho bản đồ.
Tôi không hiểu những gì sử dụng một mục đích đặc biệt lẻ reduce
có thể là lý do tại sao nó có giá trị bao gồm trong thư viện bộ giảm tốc.
Thật kỳ lạ, r/reduce
không được đề cập trong hai bài đăng trên blog giới thiệu theo như tôi có thể biết (first, second). Tài liệu chính thức ghi chú
Nói chung hầu hết người dùng sẽ không gọi r/reduce trực tiếp và thay vào đó nên chọn r/fold (...) Tuy nhiên, có thể hữu ích khi thực hiện mong muốn giảm ít kết quả trung gian hơn.
Tôi không chắc chắn câu cuối cùng sẽ gợi ý điều gì.
Các tình huống nào có thể r/reduce
xử lý lõi không thể giảm? Khi nào tôi có thể liên lạc với số r/reduce
với xác tín?
Dường như những khác biệt bạn đã đề cập (sử dụng chức năng giảm để tạo ra giá trị init và sử dụng giảm-kv cho bản đồ) là những thứ duy nhất. Tôi nghĩ chúng ta có thể suy đoán rằng việc sử dụng một phiên bản chuyên biệt cho bản đồ tránh chi phí phân bổ vì mỗi mục nhập bản đồ không phải được bao bọc thành vector 2 phần tử mà thay vào đó được truyền trực tiếp dưới dạng đối số riêng biệt để giảm hàm. –