/ / हास्केल: क्यों (+), (-) Num typeeclass का हिस्सा है? - हैस्केल, टाइपकास्ट

हास्केल: न्यू टाइपक्लास का हिस्सा (+), (-) क्यों है? - हैकसेल, टाइपक्लास

घिसी से:

Prelude> :i Num
class Num a where
(+) :: a -> a -> a
(-) :: a -> a -> a
(*) :: a -> a -> a
negate :: a -> a
abs :: a -> a
signum :: a -> a
fromInteger :: Integer -> a
-- Defined in `GHC.Num"
instance Num Word -- Defined in `GHC.Num"
instance Num Integer -- Defined in `GHC.Num"
instance Num Int -- Defined in `GHC.Num"
instance Num Float -- Defined in `GHC.Float"
instance Num Double -- Defined in `GHC.Float"

यही वजह है कि (+), (-) न्यूम क्लास का हिस्सा किसके साथ शुरू करना है?

उदाहरण के लिए - आप इस प्रकार के वर्ग को आसानी से परिभाषित कर सकते हैं:

class Plus a where
(+) :: a -> a -> a

और फिर चलो:

instance Plus [] where
(+) = (++)

और आप सेट सेट यूनियन, या जोड़ने के लिए सेट के लिए इन्हें परिभाषित कर सकते हैं (-) एक प्रकार के वर्ग का मतलब अंतर सेट करना है ... और इसे परिभाषित करने का कोई मतलब नहीं है signum एक सूची पर

बेशक मैं अपनी खुद की टाइप क्लास बना सकता हूँ जो उपयोग करता है (|+|) बजाय - लेकिन ये ऑपरेटर अकेले क्यूम के लिए हैसेल में क्यों आरक्षित थे?

तो यह चुनाव क्यों किया गया? क्या यह विरासत के कारण है या कोई ऐसा नहीं चाहता है?

उत्तर:

जवाब के लिए 2 № 1

इसका बहुत कुछ कारण ऐतिहासिक कारणों से है, लेकिन वहाँ हैगणितीय भी हैं। उदाहरण के लिए, द्विआधारी ऑपरेटरों का समर्थन करने वाली संरचनाओं के लिए पहले से ही गणितीय नाम हैं। सबसे अधिक इस्तेमाल किया जाने वाला एक मोनॉयड है, जिसे आप उपयोग कर सकते हैं Data.Monoid। यह टाइपकास्ट एक फ़ंक्शन को परिभाषित करता है mappend और एक मान memptyके लिए पहचान तत्व के बराबर mappend, और के लिए एक ऑपरेटर उर्फ ​​है mappend बुलाया <>। सूचियाँ और कई अन्य वस्तुएं मोनॉयड बनाती हैं, और संख्या वास्तव में 2 के साथ बनती हैं + और साथ *, जहां पहचान तत्व 0 और 1 हैंक्रमशः। संरचनाएं जिनके पास एक पहचान है, एक साहचर्य बाइनरी ऑपरेशन है, और उस ऑपरेशन के लिए एक व्युत्क्रम (घटाव इसके अलावा का उदाहरण है, उदाहरण के लिए) समूह कहा जाता है (मानक पुस्तकालय का हिस्सा नहीं), और संरचनाएं जो एक ऑपरेटर के तहत एक समूह बनाती हैं और एक दूसरे ऑपरेटर के तहत एक मोनोड को रिंग कहा जाता है। ये वस्तुएं बीजीय संरचनाओं / अमूर्त बीजगणित वर्गों के लिए आधार हैं।

ये गणितीय निर्माण हास्केल में लागू करने के लिए कुछ हद तक मुश्किल हैं, कम से कम बहुत अच्छी तरह से। के लिए अतिव्यापी उदाहरण हैं Monoid सबके लिए Num के साथ प्रकार + तथा *, और कुछ संख्यात्मक प्रकार के लिए वहाँ एक है Group ओवरलैप अगर / इस तरह परिभाषित किया जा सकता है कि 0 से विभाजित करना अच्छी तरह से हैपरिभाषित (कुछ संरचनाएं इसकी अनुमति दे सकती हैं)। इन अतिव्यापी उदाहरणों से बहुत सारे न्यूटाइप होते हैं जो एक दिन के लिए दिन के आधार पर काम करना मुश्किल बनाते हैं। Num टाइपसेकल्स यहाँ मदद करता है क्योंकि यह एक उपयोगी प्रदान करता हैइंटरफ़ेस, संख्याओं में हेरफेर करने और संचालन करने के लिए, जो कि केवल अकादमिया के बजाय वास्तविक विश्व कोड में उपयोग करना आसान है। के अधिक गणितीय संस्करण को पेश करने का प्रयास किया गया है Prelude, और कुछ लोग अलग-अलग सफलता के साथ इनका उपयोग करते हैं, लेकिन आपका औसत हास्केलर अधिक व्यावहारिक इंटरफ़ेस के लिए गणितीय शुद्धता को खोद देगा।

संक्षेप में, Num टाइपकास्ट को इस तरह से ऐतिहासिक कारणों के लिए परिभाषित किया गया है, लेकिन बहुत ही व्यावहारिक कारणों से भी। एक और अधिक सख्त गणितीय निर्माण अस्पष्ट है, और कई प्रकार के लिए बस का उपयोग कर Data.Monoid"रों <> परिचालक एकदम सही है।


उत्तर № 2 के लिए 1

मेरा अनुमान है कि उनका इरादा था Num संख्याओं की गणितीय प्रकृति को प्रतिबिंबित करने के लिए, बजाय कुछ सामान्य संरचना के। में ऑपरेशन Num मोटे तौर पर वे हैं जो एक गणितीय गणितीय संरचना का समर्थन करते हैं जिन्हें ए कहा जाता है अंगूठीजिसमें से पूर्णांक (और उसके बाद कोई एक्सटेंशन) एक प्रमुख उदाहरण है।

चूंकि हास्केल आपको अपने स्वयं के ऑपरेटरों को परिभाषित करने की अनुमति देता है, आप अपने स्वयं के संकेतन को सेट कर सकते हैं। फिर, जब अन्य आपके कोड को पढ़ेंगे, तो वे बता पाएंगे कि आप किसी ऐसी चीज़ के साथ काम कर रहे हैं जो कि नहीं है Numबेर की तरह, लेकिन शायद अधिक सामान्य।

हास्केल प्रस्तावना में कई दुर्भाग्यपूर्ण ऐतिहासिक डिजाइन निर्णय हैं, जो तय नहीं किए जा सकते क्योंकि वे संगतता को तोड़ देंगे। हालांकि, IMHO, के मूल डिजाइन Num टाइपकास्ट और ऑपरेटर ध्वनि है।