हाँ। इसे "डिक्शनरी पासिंग स्टाइल" कहा जाता है। कभी-कभी जब मैं कुछ विशेष रूप से मुश्किल काम कर रहा होता हूं, तो मुझे एक टाइपकास्ट को स्क्रैप करना होगा और इसे एक शब्दकोश में बदलना होगा, क्योंकि शब्दकोश पासिंग 1 अधिक शक्तिशाली है , फिर भी अक्सर काफी बोझिल हो जाता है, जिससे वैचारिक सरल कोड काफी जटिल दिखता है। मैं कभी-कभी ऐसी भाषाओं में शब्दकोश पासिंग शैली का उपयोग करता हूं जो टाइपकास्टेस का अनुकरण करने के लिए हस्केल नहीं हैं (लेकिन यह सीखा है कि यह आमतौर पर उतना अच्छा विचार नहीं है जितना लगता है)।
बेशक, जब भी अभिव्यंजक शक्ति में अंतर होता है, तो व्यापार बंद हो जाता है। यदि आप किसी दिए गए API का उपयोग अधिक तरीकों से कर सकते हैं यदि यह DPS का उपयोग करके लिखा गया है, तो API अधिक जानकारी प्राप्त कर सकता है यदि आप नहीं कर सकते हैं। व्यवहार में यह दिखाने का एक तरीका है Data.Set
, जो इस तथ्य पर निर्भर करता है कि Ord
प्रति प्रकार केवल एक शब्दकोश है। Set
भंडार उसके तत्वों के अनुसार छाँटे गए Ord
, और यदि आप एक शब्दकोश के साथ एक सेट का निर्माण, और फिर एक तत्व एक अलग से एक का उपयोग डाला, के रूप में डीपीएस के साथ संभव हो जाएगा, तो आप को तोड़ सकते थे Set
के अपरिवर्तनीय और यह क्रैश हो। एक प्रेत अस्तित्व का उपयोग करके इस विशिष्टता समस्या को कम किया जा सकता हैएपीआई में काफी कष्टप्रद जटिलता की कीमत पर, शब्दकोश को चिह्नित करने के लिए, लेकिन फिर से टाइप करें। यह भी Typeable
एपीआई में बहुत उसी तरह से पता चलता है।
विशिष्टता बिट बहुत बार नहीं आती है। आपके लिए कौन सी टाइपकास्ट बढ़िया हैं, यह आपके लिए कोड लिख रहा है। उदाहरण के लिए,
catProcs :: (i -> Maybe String) -> (i -> Maybe String) -> (i -> Maybe String)
catProcs f g = f <> g
जो दो "प्रोसेसर" लेता है जो एक इनपुट लेते हैं और आउटपुट दे सकते हैं, और उन्हें समतल कर सकते हैं, समतल करते हुए, Nothing
डीपीएस में कुछ इस तरह लिखा जाना होगा:
catProcs f g = (<>) (funcSemi (maybeSemi listSemi)) f g
हमें अनिवार्य रूप से उस प्रकार को वर्तनी देना था जिसे हम इसे फिर से उपयोग कर रहे हैं, भले ही हमने पहले ही इसे टाइप सिग्नेचर में वर्तनी कर दिया था, और यहां तक कि यह निरर्थक था क्योंकि कंपाइलर पहले से ही सभी प्रकार जानता है। क्योंकि Semigroup
किसी प्रकार पर दिए गए निर्माण का केवल एक ही तरीका है , संकलक आपके लिए यह कर सकता है। इसका "यौगिक हित" प्रकार का प्रभाव होता है जब आप बहुत सारे पैरामीट्रिक उदाहरणों को परिभाषित करना शुरू कर देते हैं और आपके प्रकारों की संरचना का उपयोग आप के लिए, जैसा कि Data.Functor.*
कॉम्बिनेटरों में करते हैं , और इसका उपयोग बहुत प्रभाव के साथ किया जाता है deriving via
जहाँ आप अनिवार्य रूप से सभी प्राप्त कर सकते हैं। आपके लिए लिखी गई आपके प्रकार की "मानक" बीजीय संरचना।
और मुझे MPTC और फ़ंडेप्स पर भी आरंभ न करें, जो सूचना को वापस टाइपकास्ट और अनुमान में फीड करते हैं। मैंने कभी भी डीपीएस में ऐसी किसी चीज को परिवर्तित करने की कोशिश नहीं की है - मुझे संदेह है कि इसमें बहुत सारे प्रकार के समानता प्रमाण शामिल होंगे - लेकिन किसी भी मामले में मुझे यकीन है कि यह मेरे दिमाग के लिए बहुत अधिक काम होगा क्योंकि मैं आराम से रहूंगा। साथ में।
-
1 यू आप reflection
जिस स्थिति में उपयोग करते हैं , वे शक्ति के बराबर हो जाते हैं - लेकिन reflection
उपयोग करने के लिए बोझिल भी हो सकते हैं।