हास्केल में एनुम का एक उपवर्ग क्यों नहीं बँधा है


9

ऐसा लगता है कि किसी भी बंधे हुए उदाहरण में Enum का एक सामान्य कार्यान्वयन होना चाहिए। मैं व्यक्तिगत रूप से एक प्रतिरूप के बारे में नहीं सोच सकता, हालांकि अगर कोई व्यक्ति ऐसा है जो रोगविज्ञानी नहीं है तो मैं समझूंगा कि ऐसा क्यों नहीं है।

:iदो टाइपकास्टेस पर करने से ऐसा लगता है कि मानक पुस्तकालय में वर्तमान में एकमात्र अपवाद ट्यूपल्स के लिए है, जो बाउंडेड हैं, लेकिन एनम नहीं। हालाँकि, किसी भी बंधे हुए टपल को भी एक सार तरीके से Enumerable होना चाहिए, बस अंतिम तत्व को बढ़ाना और फिर जब यह अधिकतम हो जाता है तो चारों ओर लपेटना।

यह परिवर्तन शायद भी जोड़ने शामिल होगा predBऔर nextB/ एक सुरक्षित के लिए या घिरा करने के लिए ऐसा ही कुछ Enum मूल्यों के माध्यम से पार करने के लिए जिस तरह से पाशन। इस मामले में toEnum 0 :: (...)बराबर होगा(toEnum 0, toEnum 0, ...) :: (...)


3
वास्तव में इस आधिकारिक रूप से जवाब नहीं दे सकता है, लेकिन 0 और 1 के बीच सभी वास्तविक संख्याओं की सीमा पर विचार करें। इसमें स्पष्ट निचले और ऊपरी सीमाएं हैं, लेकिन इसमें बेशुमार अनंत सदस्य हैं।
डोभाल

@ डोवल जो एक उचित बिंदु है। हालाँकि, सभी वास्तविक संख्याओं (सामान्य रूप से अनंत सदस्यों) के बारे में यही कहा जा सकता है, लेकिन Double/ Floatऔर सभी समान प्रकार Enumवैसे भी लागू होते हैं , वे बस बनाते हैं succ = (+ 1)और fromEnum = truncate। हास्केल का तरीका वास्तव में व्यावहारिकता के दृष्टिकोण से समझ में आता है, अन्यथा [0, 0.5 ..] और इसी तरह से काम नहीं करेगा, इसलिए ऐसा लगता है कि हस्केल जब एनम की बात करते हैं, तो उनकी गिनती के बारे में चिंता नहीं होती है।
अर्धविराम

1
मुझे पता है कि नहीं था succहै (+1)। यही कारण है कि अजीब बात है, क्योंकि Doubleऔर Floatअनंत परिशुद्धता की जरूरत नहीं है और इस प्रकार हैं गणनीय - succ+1 होने के लिए परिभाषित किया गया है हो सकता है ULP
डोभाल

2
@ डोवल मुझे लगता है कि इसका कारण यह था कि हास्केल कोर टीम चाहती थी [1 ..] डबल्स के साथ एक ही बात का मतलब है कि इसका अर्थ है इनट्स के साथ।
अर्धविराम

@ साइमिकोलन डबल्स और फ्लोट्स वास्तविक संख्या नहीं हैं (जैसे कि कुछ सटीक खोए बिना पीआई को स्टोर नहीं कर सकते हैं) इसलिए वे असंख्य हैं
jk।

जवाबों:


8

एक व्यावहारिक उदाहरण जो मुझे पसंद है वह प्रोग्रामिंग भाषाओं की दुनिया से आता है: एक ओओ प्रणाली में प्रकारों का सेट बाध्य और असतत है, लेकिन गणना करने योग्य नहीं है, और आंशिक रूप से आदेश दिया गया है लेकिन पूरी तरह से आदेश नहीं दिया गया है।

प्रश्न में आंशिक क्रम उप-संबंध है <:। ऊपरी बाउंड तब शीर्ष प्रकार होगा (जिसे C # कॉल objectऔर स्काला कॉल Any), और निचला बाउंड निचला प्रकार होगा (Scala's Nothing! C # / Java में बोलने का कोई समकक्ष नहीं है)।

हालांकि, टाइप सिस्टम में सभी प्रकारों को एन्यूमरेट करने का कोई तरीका नहीं है, इसलिए आप ए नहीं लिख सकते हैं instance Enum Type। यह स्पष्ट होना चाहिए: उपयोगकर्ता अपने स्वयं के प्रकार लिख सकते हैं इसलिए यह जानने का कोई तरीका नहीं है कि वे पहले से क्या करेंगे। आप किसी भी दिए गए प्रोग्राम में सभी प्रकार की गणना कर सकते हैं, लेकिन पूरे सिस्टम में नहीं।

इसी तरह, (उपप्रकार की एक निश्चित उचित परिभाषा के अनुसार) <:रिफ्लेक्टिव, सकर्मक और एंटीसिमेट्रिक है लेकिन कुल है । प्रकार के जोड़े हैं जो कि असंबंधित हैं <:। ( Catऔर Dogदोनों उप-प्रकार हैं Animal, लेकिन दोनों में से कोई भी उप-प्रकार नहीं है।)


मान लीजिए कि हम एक साधारण OO भाषा के लिए एक कंपाइलर लिख रहे हैं। यहाँ हमारे सिस्टम में प्रकारों का प्रतिनिधित्व है:

data Type = Bottom | Class { name :: String, parent :: Type } | Top

और घटाव संबंध की परिभाषा:

(<:) :: Type -> Type -> Bool
Bottom <: _ = True
Class _ _ <: Bottom = False
Class n t <: s@(Class m _)
    | n == m = True  -- you can't have different classes with the same name in this hypothetical language
    | otherwise = t <: s  -- try to find s in the parents of this class
Class _ _ <: Top = True
Top <: Top = True
Top <: _ = False

यह हमें एक असाधारण संबंध भी देता है।

(>:) :: Type -> Type -> Bool
t >: s = s <: t

आप दो प्रकारों की सबसे कम ऊपरी सीमा भी पा सकते हैं,

lub :: Type -> Type -> Type
lub Bottom s = s
lub t Bottom = t
lub t@(Class _ p) s@(Class _ q) =
    | t >: s = t
    | t <: s = s
    | p >: s = p
    | t <: q = q
    | otherwise = lub p q
lub Top _ = Top
lub _ Top = Top

एक्सरसाइज: यह दिखाएं कि Typeएक बाउंडेड पूर्ण पॉसेट दो तरीके से बनता है, अंडर <:और अंडर >:


बहुत अच्छे धन्यवाद! यह मेरे प्रश्न का पूरी तरह से उत्तर देता है और ऑर्ड के बारे में मेरे अनुवर्ती प्रश्न का भी उत्तर देता है। क्या Eq के समान मुद्दे होंगे? जहाँ गैर-समकारी प्रकार में अधिकतमबाउंड या मिनीबाउंड हो सकता है। इस मामले में कैट == डॉग को केवल झूठ बोलना चाहिए, क्योंकि वे अलग-अलग वर्ग हैं, या क्या यह अयोग्य होगा क्योंकि पेड़ की स्थिति न तो दूसरे के ऊपर या नीचे रखती है?
अर्धविराम

एक आदेश का मतलब एक समानता है - बस परिभाषित करें x == y = x <= y && y <= x। अगर मैं एक Posetक्लास डिजाइन कर रहा होता class Eq a => Poset a। एक त्वरित Google इस बात की पुष्टि करता है कि अन्य लोगों का भी यही विचार है
बेंजामिन हॉजसन

क्षमा करें मेरा प्रश्न अस्पष्ट था। मेरे कहने का मतलब यह था कि क्या Eq को बाध्य किया गया था, भले ही वह Ord का मतलब नहीं है।
अर्धविराम 19

@semicolon फिर से दो वर्गों के बीच कोई संबंध नहीं है। विचार करें data Bound a = Min | Val a | Maxकि कौन सा तत्व और तत्वों के aसाथ एक प्रकार +∞का वृद्धि -∞करता है। निर्माण के द्वारा Bound aहमेशा एक उदाहरण बनाया जा सकता है, Boundedलेकिन यह केवल तभी अंतर्निहित होगा यदि अंतर्निहित प्रकार aहै
बेंजामिन हॉजसन

बिलकुल निष्पक्ष। मुझे लगता है कि एक उदाहरण कार्यों कि लेने के लिए और प्रकार की वापसी मान हो सकता है Double, जहां const (1/0)है maxBoundऔर const (negate 1/0)है minBoundलेकिन \x -> 1 - xऔर \x -> x - 1अतुलनीय है।
अर्धविराम

4

यह इसलिए है क्योंकि ऑपरेशन स्वतंत्र हैं, इसलिए उन्हें एक उपवर्ग संबंध के साथ बांधना वास्तव में आपको कुछ भी नहीं खरीदता है। कहते हैं कि आप एक कस्टम प्रकार बनाना चाहते थे जो लागू हो Bounded, शायद Doublesअधिकतम और न्यूनतम के बीच विवश हो, लेकिन आपको किसी भी Enumसंचालन की कोई आवश्यकता नहीं थी । यदि आप Boundedएक उपवर्ग थे, तो आपको सभी Enumकार्यों को वैसे भी लागू करना होगा , बस इसे संकलित करने के लिए।

यह वास्तव में कोई फर्क नहीं पड़ता है अगर वहाँ के लिए एक उचित कार्यान्वयन Enum, या किसी अन्य प्रकार के टाइपकास्ट है। यदि आपको वास्तव में इसकी आवश्यकता नहीं है, तो आपको इसे लागू करने के लिए मजबूर नहीं होना चाहिए।

इसके विपरीत कहें, Ordऔर Eq। वहां, Ordऑपरेशन Eqलोगों पर निर्भर होते हैं, इसलिए यह दोहराव से बचने और स्थिरता सुनिश्चित करने के लिए उपवर्ग की आवश्यकता समझ में आता है।


1
उन मामलों में, यह परिभाषा का हिस्सा है। सभी मोनाड भी परिभाषा के अनुसार अनुप्रयोग और फंक्शनल हैं, इसलिए आप दूसरों को पूरा किए बिना मोनाड "अनुबंध" को पूरा नहीं कर सकते। मैं यह जानने के लिए गणित से काफी परिचित नहीं हूं कि क्या यह एक मौलिक संबंध या एक थोपा हुआ परिभाषा है, लेकिन किसी भी तरह से, हम अब इसके साथ फंस गए हैं।
कार्ल बेज़ेलफेल्ट

6
@semicolon के लिए प्रलेखन काBounded कहना है कि "ऑर्ड बाउंडेड का सुपरक्लास नहीं है क्योंकि टाइप पूरी तरह से ऑर्डर नहीं किए गए ऊपरी और निचले सीमा भी हो सकते हैं।"
बेंजामिन हॉजसन

1
@BenjaminHodgson ने आंशिक रूप से ऑर्डर किए गए प्रकारों के बारे में भी नहीं सोचा। गैर-पैथोलॉजिकल उदाहरण के लिए +1 और प्रलेखन के उद्धरण के लिए।
डोभाल

1
@semicolon कंप्यूटरों की दुनिया से आंशिक आदेश का एक उदाहरण OO भाषाओं में सबटाइपिंग हो सकता है। लेखन <:के लिए की एक उप-प्रकार है , ∀ T S. T <: S ∨ S <: Tनहीं रखता है (जैसे, int !<: bool ∧ bool !<: int)। यदि आप एक कंपाइलर लिख रहे थे तो आप इसमें भाग लेंगे।
बेंजामिन हॉजसन

1
@BenjaminHodgson आह ठीक है। इसलिए उदाहरण के लिए यदि A B और C का सुपरक्लास है, और D, B और C का उपवर्ग है, तो B और C अतुलनीय हैं, लेकिन A और D अधिकतम / मिनट हैं?
अर्धविराम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.