यह मुहावरेदार नहीं माना जाता है, और संभावना पर बाद में भ्रामक त्रुटियों को बढ़ावा मिलेगा:
अब आप कुछ Rectangle
मान निर्धारित कर सकते हैं। इसके बजाय, आप बस कार्यों कि डेटा का निर्माण परिभाषित करना चाहिए:
point :: Rectangle
point = Rectangle 0 0
line :: Length -> Rectangle
line l = Rectangle l 0
square :: Int -> Rectangle
square a = Rectangle a a
यह आपको स्पष्ट ऐसे नाम हैं जो, प्रत्येक से अधिक भार के अर्थ विज्ञान का वर्णन नहीं बल्कि संख्या और तर्क का प्रकार आप जो को स्पष्ट करने के लिए दिया पर भरोसा करने की बजाय देने की अनुमति देता मतलब है।
हालांकि, अगर आप अतिभारित संस्करण लिखने के लिए चाहते हैं, आप इसे आसानी से typeclasses के साथ क्या कर सकते हैं:
class MakeRectangle a where
rectangle :: a
instance MakeRectangle Rectangle where
rectangle = Rectangle 0 0
instance MakeRectangle (Length -> Rectangle) where
rectangle l = Rectangle l 0
instance MakeRectangle (Length -> Width -> Rectangle) where
rectangle = Rectangle
आप इस संकलन के लिए अपनी फ़ाइल के शीर्ष पर {-# LANGUAGE FlexibleInstances #-}
की आवश्यकता होगी। इस तरह की एक चाल मानक Text.Printf
लाइब्रेरी द्वारा उपयोग की जाती है, लेकिन मैं इसे हास्केल में ओवरलोडिंग का विशेष रूप से अच्छा उदाहरण नहीं मानूंगा; ओवरलोडेड वैल्यू के प्रकार के लिए लगभग हमेशा कुछ संरचना होती है, जबकि यहां इसकी पूरी संरचना उदाहरण के आधार पर निर्धारित होती है, जो टाइप अनुमान के तरीके में मिल सकती है; इतना ही नहीं, लेकिन ऐसे कोई उचित कानून नहीं हैं जो उदाहरणों को नियंत्रित करते हैं (वास्तव में, किसी भी प्रकार की अनुमति देने के लिए प्रकार बहुत सामान्य है)।
लेकिन यदि आप वास्तव में ऐसा करना चाहते हैं, तो आप कर सकते हैं, और आमतौर पर यह एक बुरा विचार है, कभी-कभी (printf
के मामले में) यह आपके इच्छित इंटरफ़ेस को पूरा करने का एकमात्र तरीका है।
GHCi में यह आज़माने के लिए, आप प्रकार आप स्पष्ट रूप से उपयोग कर रहे हैं का उल्लेख करना होगा, या यह उदाहरणों को हल करने में सक्षम नहीं होगा:
GHCi> rectangle :: Rectangle
Rectangle 0 0
GHCi> rectangle (1 :: Length) :: Rectangle
Rectangle 1 0
GHCi> rectangle (1 :: Length) (2 :: Width) :: Rectangle
Rectangle 1 2
मैं सी ++ के बाद हैकेल मॉडल करने की कोशिश करने से परेशान नहीं होगा; यह सिर्फ बहुत दर्द का कारण बन जाएगा। इसके अलावा, आपका दूसरा आयताकार कन्स्ट्रक्टर एक लाइन क्यों है? मुझे लगता है कि एक और समझदार कार्यान्वयन डिफ़ॉल्ट रूप से (1, 1) होगा, और यदि आप एक int प्राप्त करते हैं, तो एक वर्ग बनाने के लिए (x, x) में गुजरें। – alternative
कभी कन्स्ट्रक्टर प्रारंभिक सूची के बारे में सुना है? –
@VladLazarenko: कभी उन लोगों के बारे में सुना है जो अभी भी सीख रहे हैं? (संकेत: आप उनमें से हैं, हर कोई है) –