कार्यात्मक प्रोग्रामिंग में मौजूदा प्रकार वास्तव में बुरा अभ्यास नहीं माना जाता है। मुझे लगता है कि ट्रिपिंग क्या है जो यह है कि अस्तित्व के लिए सबसे अधिक उपयोग किए जाने वाले उपयोगों में से एक अस्तित्वपरक टाइपकास्ट एंटीपैटर्न है , जो बहुत से लोग मानते हैं कि बुरा व्यवहार है।
इस पैटर्न को अक्सर इस सवाल के जवाब के रूप में समझा जाता है कि विषम टाइप किए गए तत्वों की सूची कैसे होती है जो सभी एक ही टाइपकास्ट को लागू करते हैं। उदाहरण के लिए, हो सकता है कि आपके पास उन मूल्यों की सूची हो, जिनमें Show
उदाहरण हैं:
{-# LANGUAGE ExistentialTypes #-}
class Shape s where
area :: s -> Double
newtype Circle = Circle { radius :: Double }
instance Shape Circle where
area (Circle r) = pi * r^2
newtype Square = Square { side :: Double }
area (Square s) = s^2
data AnyShape = forall x. Shape x => AnyShape x
instance Shape AnyShape where
area (AnyShape x) = area x
example :: [AnyShape]
example = [AnyShape (Circle 1.0), AnyShape (Square 1.0)]
इस तरह कोड के साथ समस्या यह है:
- एकमात्र उपयोगी ऑपरेशन आप
AnyShape
अपने क्षेत्र को प्राप्त करने के लिए एक पर प्रदर्शन कर सकते हैं ।
- आपको अभी भी
AnyShape
एक प्रकार के आकार को लाने के लिए कंस्ट्रक्टर का उपयोग करने की आवश्यकता है AnyShape
।
जैसा कि यह पता चला है, कोड का टुकड़ा वास्तव में आपको कुछ भी नहीं मिलता है जो यह छोटा नहीं है:
class Shape s where
area :: s -> Double
newtype Circle = Circle { radius :: Double }
instance Shape Circle where
area (Circle r) = pi * r^2
newtype Square = Square { side :: Double }
area (Square s) = s^2
example :: [Double]
example = [area (Circle 1.0), area (Square 1.0)]
बहु विधि वर्गों के मामले में, एक ही प्रभाव आम तौर पर एक "तरीकों में से रिकॉर्ड" का उपयोग कर की तरह एक typeclass उपयोग करने के बजाय एन्कोडिंग-की से अधिक बस पूरा किया जा सकता Shape
है, तो आप एक रिकॉर्ड प्रकार जिसका क्षेत्रों में "तरीकों" कर रहे हैं परिभाषित Shape
प्रकार , और आप अपने हलकों और चौकों को Shape
एस में बदलने के लिए कार्य लिखते हैं ।
लेकिन इसका मतलब यह नहीं है कि अस्तित्वगत प्रकार एक समस्या है! उदाहरण के लिए, रस्ट में उनके पास विशेषता ऑब्जेक्ट्स नामक एक विशेषता होती है जिसे लोग अक्सर एक विशेषता पर एक अस्तित्वगत प्रकार के रूप में वर्णित करते हैं (रस्ट के प्रकार वर्ग के संस्करण)। यदि हस्केल में अस्तित्ववादी टाइपकास्टेस एक एंटीपार्टर्न हैं, तो क्या इसका मतलब यह है कि रस्ट ने एक बुरा समाधान चुना है? नहीं! हास्केल दुनिया में प्रेरणा वाक्यविन्यास और सुविधा के बारे में है, सिद्धांत के बारे में नहीं।
इस डालने का एक और अधिक गणितीय रास्ता ओर इशारा करते हुए किया जाता है कि AnyShape
इसके बाद के संस्करण और से प्रकार Double
हैं isomorphic , वहाँ उन दोनों के बीच एक "दोषरहित रूपांतरण" (अच्छी तरह से, बिंदु परिशुद्धता चल बचाने के लिए) है:
forward :: AnyShape -> Double
forward = area
backward :: Double -> AnyShape
backward x = AnyShape (Square (sqrt x))
इतनी सख्ती से, आप एक बनाम दूसरे को चुनकर कोई शक्ति हासिल नहीं कर रहे हैं और न ही हार रहे हैं। इसका मतलब है कि चुनाव अन्य कारकों जैसे उपयोग में आसानी या प्रदर्शन पर आधारित होना चाहिए।
और ध्यान रखें कि इस विषम सूची उदाहरण के बाहर अस्तित्वगत प्रकार के अन्य उपयोग हैं, इसलिए उन्हें रखना अच्छा है। उदाहरण के लिए, हास्केल का ST
प्रकार, जो हमें ऐसे कार्यों को लिखने की अनुमति देता है जो बाह्य रूप से शुद्ध हैं लेकिन आंतरिक रूप से मेमोरी म्यूटेशन संचालन का उपयोग करते हैं, संकलन-समय पर सुरक्षा की गारंटी देने के लिए अस्तित्वगत प्रकारों पर आधारित तकनीक का उपयोग करते हैं।
तो सामान्य उत्तर यह है कि कोई सामान्य उत्तर नहीं है। अस्तित्वगत प्रकारों के उपयोगों को केवल संदर्भ में ही आंका जा सकता है - और उत्तर अलग-अलग भाषाओं द्वारा प्रदान की जाने वाली सुविधाओं और वाक्यविन्यास के आधार पर भिन्न हो सकते हैं।