Transduser adalah alat kombinasi untuk mengurangi fungsi.
Contoh: Fungsi pereduksi adalah fungsi yang mengambil dua argumen: Hasil sejauh ini dan masukan. Mereka mengembalikan hasil baru (sejauh ini). Misalnya +
: Dengan dua argumen, Anda dapat menganggap yang pertama sebagai hasil sejauh ini dan yang kedua sebagai masukan.
Transduser sekarang dapat menggunakan fungsi + dan menjadikannya fungsi dua kali lebih banyak (menggandakan setiap input sebelum menambahkannya). Seperti inilah tampilan transduser itu (dalam istilah paling dasar):
(defn double
[rfn]
(fn [r i]
(rfn r (* 2 i))))
Sebagai ilustrasi, gantikan rfn
dengan +
untuk melihat bagaimana +
diubah menjadi dua kali plus:
(def twice-plus ;; result of (double +)
(fn [r i]
(+ r (* 2 i))))
(twice-plus 1 2) ;-> 5
(= (twice-plus 1 2) ((double +) 1 2)) ;-> true
Begitu
(reduce (double +) 0 [1 2 3])
sekarang akan menghasilkan 12.
Fungsi pereduksi yang dikembalikan oleh transduser tidak bergantung pada bagaimana hasil diakumulasikan karena mereka terakumulasi dengan fungsi pereduksi yang diteruskan kepadanya, tanpa diketahui caranya. Di sini kami menggunakan conj
sebagai pengganti +
. Conj
mengambil koleksi dan nilai dan mengembalikan koleksi baru dengan nilai yang ditambahkan.
(reduce (double conj) [] [1 2 3])
akan menghasilkan [2 4 6]
Mereka juga tidak tergantung pada jenis sumber inputnya.
Beberapa transduser dapat dirangkai sebagai resep (dapat dirantai) untuk mengubah fungsi pengurangan.
Pembaruan: Karena sekarang ada halaman resmi tentang itu, saya sangat menyarankan untuk membacanya: http://clojure.org/transducers