2012-05-26 30 views
9

स्पष्ट कारणों से निम्नलिखित कार्य नहीं करता है।क्लोजर में मोनॉयड प्रोटोकॉल कैसे लिखें?

(defprotocol Monoid 
    (mappend [a b]) 
    (mzero [])) 

mzero शून्य तर्क हैं, तो और शून्य तर्क के तरीकों की अनुमति नहीं है (या उसका कोई मतलब नहीं है) प्रोटोकॉल में। हास्केल या स्कैला में, जहां प्रेषण मूल्य-आधारित के बजाय प्रकार-आधारित है, यह कोई समस्या नहीं है।

क्लोजर में Monoid प्रोटोकॉल को संकल्पना और लिखने का सही तरीका क्या होगा?

+0

आपको मॉड्यूल की बजाय प्रोटोकॉल होने की आवश्यकता क्यों है? यदि आप विभिन्न कार्यान्वयन की उम्मीद कर रहे हैं तो एक विशेष उपयोग मामले में कार्यान्वयन की आवश्यकता है कि कैसे अनुमान लगाया जाएगा? (मुझे लगता है कि यह एक अच्छा सवाल है, मैं बस शामिल मुद्दे का पीछा करने की कोशिश कर रहा हूं)। –

+1

@andrewcooke हास्केल infers उपयोग साइट पर स्थिर प्रकार के आधार पर infers। जिसे विधि कहा जाता है उसे स्थिर रूप से हल किया जाता है। –

+0

@andrewcooke, आपके कथन के संदर्भ में मॉड्यूल का क्या अर्थ होगा? – missingfaktor

उत्तर

5

source पर देखकर, जिस तरह से यह new reducers library में लागू किया गया है, एक procotol के रूप में नहीं बल्कि एक अधिभारित कार्य है। नो-Args कॉल mzero है; दो तर्क कॉल मैपेंड है।

अधिक वास्तव में, monoid दो तर्क लेता है - op और ctor और एक समारोह, जो जब कोई तर्क के साथ कहा जाता है, का मूल्यांकन करता है ctor देता है, और जब op करने के लिए दो, प्रतिनिधियों के साथ कहा जाता है।

यह एक संगत में शून्य को कैसे नियंत्रित किया जाता है, इसके साथ संगत है, उदाहरण के लिए - reduce (गुना) आवश्यक होने पर शून्य खोजने के लिए कोई तर्क नहीं मिला है।

मुझे कुछ अपरिहार्य दिखाने के लिए थोड़ा शर्म आती है, लेकिन मुझे नहीं लगता कि आप क्लोजर के भीतर बेहतर कैसे कर सकते हैं। टिप्पणियों में स्पष्टीकरण/शिक्षा के लिए धन्यवाद।

+0

ठीक है, यह सवाल का जवाब देता है। धन्यवाद! – missingfaktor

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