2014-09-05 5 views
6

में 'core.reducers` लाइब्रेरी समझाएं मैं वर्तमान में clojure मजेदार के लिए सीख रहा हूं और आज मैं इस article about reducers में चलाता हूं। मुझे यह न केवल दिलचस्प बल्कि मेरे लिए मुश्किल लगता है। अभी शुरुआत के रूप में:आम आदमी के शब्द

  1. मैं कैसे कोर map, filter, reduce

  2. मैं समझता हूँ कि core/map, core/filter ... वापसी एक sequable col

  3. रिच हिक्की उल्लेख core.reducers/map उपयोग करने के लिए पता है। .. reducible को वापस

core/map के कार्यान्वयन के कारण ... और core.reducers/map ... बहुत समान दिखते हैं। मेरा सवाल

  1. reducible कॉलम के कार्यकाल में कॉल कैसे अंतर करता है?

  2. क्या कोई मुझे reducible फ़ंक्शन का कुछ मामूली उदाहरण दे सकता है?

बहुत बहुत

उत्तर

2

मेरे लिए धन्यवाद, reducers की मुख्य विचार है कि वे वास्तव कम से map/filter/reduce करते हैं। Reducers निर्दिष्ट नहीं करते हैं कि वे एक संग्रह या किसी अन्य प्रकार की डेटा संरचना पर, या जो कुछ भी उत्पादित करते हैं, वे संग्रह या कुछ और हो सकता है, वे सीरियल या समानांतर में आलसी या उत्सुकता से निष्पादित करते हैं। उदाहरण:

  1. map/filter/reduceएक संग्रह पास किया जाना चाहिए और एक संग्रह का उत्पादन होगा; एक reducer या तो करने की ज़रूरत नहीं है। Reducers का यह विचार transducers में विस्तारित है ताकि एक ही ट्रांसड्यूसर पर संग्रह या core.async चैनल पर लागू हो सके।

  2. रेड्यूसर निर्दिष्ट नहीं करते हैं कि उन्हें निष्पादित किया जाता है। map/filter/reduce हमेशा संग्रह में एक धारावाहिक तरीके से निष्पादित करें; समानांतर में कभी नहीं। यदि आप समांतर में संग्रह में निष्पादित करना चाहते हैं, तो आपको एक अलग फ़ंक्शन का उपयोग करना होगा: pmap। आप कल्पना कर सकते हैं कि यदि आप समानांतर में फ़िल्टर करना चाहते हैं, तो आप भी एक फ़ंक्शन pfilter बना सकते हैं (यह अस्तित्व में नहीं है लेकिन आप इसे लिख सकते हैं)। प्रत्येक फ़ंक्शन के समांतर संस्करण को बनाने के बजाय, रेड्यूसर बस कहते हैं, "मुझे परवाह नहीं है कि मुझे कैसे निष्पादित किया गया है" और यह एक अन्य फ़ंक्शन (fold रेड्यूसर के मामले में) पर निर्णय लेता है कि यह निष्पादन किया जाना चाहिए कि निष्पादन किया जाना चाहिए या नहीं समानांतर में या नहीं। foldpmap से अधिक सामान्य है क्योंकि यह पर लागू होने वाले रेड्यूसर फ़िल्टरिंग या मैपिंग (या दोनों करने के लिए रचित) कर सकते हैं।

सामान्य तौर पर, क्योंकि reducers के बारे में कम मान्यताओं क्या वे पर लागू होगा, क्या वे या उत्पादन कैसे वे लागू होते हैं, वे अधिक लचीले होते हैं और इसलिए की एक व्यापक विविधता में इस्तेमाल किया जा सकता स्थितियों। यह उपयोगी है क्योंकि reducers "यह कैसे करता है" के बजाय "आपका प्रोग्राम क्या करता है" पर ध्यान केंद्रित करता है। इसका अर्थ यह है कि आपका कोड विकसित हो सकता है (उदा। एक धागे से एक बहु थ्रेड या यहां तक ​​कि एक वितरित अनुप्रयोग तक) प्रोग्राम के उस हिस्से को अनिवार्य रूप से स्पर्श किए बिना जो आपके कोड के मूल तर्क को बनाता है।

+0

tks @optevo, यह बहुत बड़ा है, लेकिन आपने जवाब नहीं दिया है कि 'core.reducers' में 'कमजोर' कार्य कैसे काम करता है और क्या आप इसका उदाहरण बना सकते हैं? – babygau

संबंधित मुद्दे