2016-03-12 36 views
5

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?

+0

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. –

Trả lời

3

Hai lý do có thể:

  1. Nó có khác nhau - tốt hơn! - ngữ nghĩa hơn clojure.core/reduce trong trường hợp tuần tự initless. Trong bài trình bày năm 2014 của Conj, Rich Hickey hỏi "ai biết ngữ nghĩa của reduce là gì khi bạn gọi nó bằng bộ sưu tập và không có giá trị ban đầu?" - follow this link for the exact spot in the presentation - và sau đó mô tả các ngữ nghĩa nói là "một quy tắc vô lý, phức tạp" và "một trong những điều tồi tệ nhất [ông] đã từng sao chép từ Common Lisp" - cf. Common Lisp's reduce contract. Bản trình bày là về đầu dò và bối cảnh của nhận xét là một cuộc thảo luận của transduce, có một hợp đồng cao cấp, đơn giản hơn; r/reduce cũng vậy.

  2. Thậm chí không xem xét ở trên, thật tuyệt khi có phiên bản reduce với hợp đồng rất gần với fold. Điều đó cho phép đơn giản "thử một, thử" điểm chuẩn khác với các đối số tương tự, cũng như chỉ đơn giản là thay đổi tâm trí của một người.