2014-07-15 9 views
5

मैं वर्तमान में पारंपरिक स्कैला से स्कालाज़ शैली से कुछ कोड पोर्ट कर रहा हूं।स्कालज़ बाइंड [सेक] टाइपक्लास

यह मेरे कंक्रीट प्रकार (यानी सूची, वेक्टर) के बजाय सीधे मेरे खुला एपीआई हस्ताक्षर में सेक विशेषता का उपयोग करने के लिए मेरे अधिकांश कोड के माध्यम से काफी आम है। हालांकि, यह स्कालाज़ के साथ कुछ समस्या उत्पन्न करता है, क्योंकि यह एक बाइंड [सेक] टाइपक्लास का कार्यान्वयन प्रदान नहीं करता है।

यानी यह सही तरीके से काम करेगा।

List(1,2,3,4) >>= bindOperation 

लेकिन इस त्रुटि के साथ विफल नहीं

Seq(1,2,3,4) >>= bindOperation 

जाएगा could not find implicit value for parameter F0: scalaz.Bind[Seq]

मुझे लगता है इस Scalaz में एक जानबूझकर डिजाइन निर्णय है - लेकिन कैसे पूर्व में होना करने के लिए पर इरादा/सबसे अच्छा अभ्यास को लेकर अनिश्चित हूं ।

क्या मुझे अधिक लचीला सेक इंटरफ़ेस का उपयोग करने के बजाय उचित रूप से सूची/वेक्टर को अपना कोड लिखना चाहिए? या क्या मुझे बस अपना खुद का बांध [सेक] टाइपक्लास परिभाषित करना चाहिए?

+1

हालांकि, 'इंडेक्सेडस्क' का एक मोनड उदाहरण है। – rightfold

उत्तर

11

संग्रह लाइब्रेरी सबटाइपिंग को समायोजित करने के लिए बैकफ्लिप्स करता है: जब आप किसी विशिष्ट संग्रह प्रकार (सूची, मानचित्र इत्यादि) पर map का उपयोग करते हैं, तो आप (आमतौर पर) एक ही प्रकार का वापस प्राप्त करेंगे। यह an extremely complex inheritance hierarchy के उपयोग के माध्यम से इसे CanBuildFrom जैसे प्रकार वर्गों के साथ प्रबंधित करता है। यह काम पूरा हो जाता है (कम से कम तर्कसंगत), लेकिन जटिलता बहुत सिद्धांत नहीं लगती है। यह एक गड़बड़ है। बहुत से लोग इसे नफरत करते हैं।

जटिलता आमतौर पर लाइब्रेरी उपयोगकर्ता के रूप में बचने के लिए बहुत आसान है, लेकिन लाइब्रेरी डिज़ाइनर के लिए यह एक दुःस्वप्न है। अगर मैं Seq के लिए एक मोनाड उदाहरण प्रदान करता हूं, तो इसका मतलब है कि मेरे सभी उपयोगकर्ताओं के प्रकार पदानुक्रम को Seq पर हर प्रकार के एक मोनैडिक ऑपरेशन का उपयोग करते हैं।

Scalaz लोगों, वैसे भी बहुत ज्यादा subtyping, इसलिए अधिकांश भाग के लिए Scalaz hierarchy- List, Vector की पत्तियों के आसपास रहता है पसंद करने के लिए नहीं करते, आदि उदाहरण के लिए आप इस निर्णय on the mailing list की कुछ चर्चा देख सकते हैं।

जब मैंने पहली बार स्कालाज़ का उपयोग करना शुरू किया, मैंने बहुत उपयोगिता कोड लिखा जिसने Seq इत्यादि के उदाहरण प्रदान करने की कोशिश की और CanBuildFrom के साथ उपयोग करने योग्य बना दिया। तब मैंने रोका, और अब मैं केवल अपने ही कोड में List, Vector, Map, और Set का उपयोग करके स्कालज़ का पालन करता हूं। यदि आप "स्कालज़ स्टाइल" के लिए प्रतिबद्ध हैं, तो आपको यह भी करना चाहिए (या स्कालज़ के अपने IList, ISet, ==>> इत्यादि को भी अपनाना चाहिए)। आपको आमतौर पर सर्वोत्तम प्रथाओं पर स्पष्ट समझौता नहीं मिल रहा है, हालांकि, और दोनों दृष्टिकोण काम करने के लिए किए जा सकते हैं, इसलिए आपको केवल वही पसंद करने के लिए प्रयोग करने की आवश्यकता होगी।

+1

क्या यह भी कारण है उदा। 'scalaz.NonEmptyList [टी]' 'सेक [टी]' का उपप्रकार नहीं है? – rightfold

+1

@ राइटफोल्ड: हाँ, और मैं आश्चर्यचकित नहीं होगा अगर 'NonEmptyList' किसी दिन परिवर्तनीय हो जाता है, जो' Seq' दलदल में फंसने का एक और कारण नहीं है। –

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