16

हास्केल में, उठाए गए प्रकार के उत्पादों का मतलब है कि (ए, बी, सी) और (ए, (बी, सी)) के बीच एक अर्थपूर्ण अंतर है।अनलिमिटेड प्रकार के उत्पादों का नुकसान?

यदि सभी उत्पादों के सभी पैटर्न मैचों हमेशा अपरिहार्य थे, तो कोई अंतर नहीं होगा, और (ए, बी, सी) (ए, (बी, सी)) के लिए वाक्य रचनात्मक चीनी हो सकता है।

हास्केल ने उत्पादों को उठाने का चयन क्यों किया?

+1

क्योंकि एक फ्लैटन ट्यूपल कम उपयोगी है? – kennytm

+2

"flatten" से आपका मतलब अनलिमिटेड है? यदि हां, तो क्यों? यह मेरे लिए स्पष्ट प्रतीत नहीं होता है, और अनलिमिटेड ट्यूपल में औपचारिक बीजगणितीय गुण बेहतर होते हैं। –

+1

मैं इसके बजाय '(ए, (बी, (सी,())) के लिए वाक्य रचनात्मक चीनी होना चाहता हूं)' एचएलिस्ट – yairchu

उत्तर

6

एक कारण यह है कि एक unlifted उत्पाद के लिए लागू करने seq समानांतर/interleaved परिकलन करना पड़ता है, क्योंकि seq (a, b) TrueTrue होने के लिए यदि और केवल यदि कम से कम a में से एक और b गैर नीचे है माना जायेगा। आप इस कारण बहुत समझाने नहीं मिल सकता है, कैसे आप के बारे में seq महसूस पर निर्भर करता है, लेकिन निश्चित रूप से बहुरूपी seq परिभाषा हास्केल का एक हिस्सा है ...

+0

की तरह मुझे लगता है कि सीईसी को एक प्रकार के वर्ग का उपयोग करना चाहिए, और मुझे लगता है कि इसके वर्तमान में "seq" एक डाइविंग प्रोग्राम को समाप्त करने के लिए फॉर्म को अनुमति दी जानी चाहिए, बस दूसरी तरफ नहीं। – Peaker

+0

IOW, मुझे वास्तव में seq (\ _ | \ _, \ _ | \ _) के साथ कोई समस्या नहीं है True == सही है अगर टुपल्स को अनलिफ्ट किया गया हो। – Peaker

+0

उस बिंदु पर, आप 'Seq'' (और 'a -> b' के लिए ') का उदाहरण' (ए, बी) 'नहीं बना सकते हैं। –

0

आप एक अर्थ अंतर उत्पादन कर सकते हैं यदि आप प्रकार के सिलसिले में करना चाहते हैं कक्षाएं।

(a, b, c) और (a, (b, c)) कक्षाओं को अलग-अलग कर सकते हैं। बस

show (1, 2, 3) 

और

show (1, (2, 3)) 

के बारे में सोच मैं इसे जवाबी सहज ज्ञान युक्त दोनों उपज ही उत्पादन पर विचार होगा।

+4

मैं वास्तव में वास्तव में इसे नापसंद करता हूं। यह एन-ट्यूपल विस्फोट का कारण बनता है (उदाहरण: ghci में "जानकारी दिखाएँ" देखें) और यह सभी tuples के लिए उदाहरण प्राप्त करने के लिए केवल (ए, बी) को तुरंत असंभव बनाता है। मैं वास्तव में (ए, बी, सी) (ए, (बी, सी) के लिए अलग-अलग अर्थशास्त्र नहीं चाहता हूं। मैं सिर्फ दोनों के लिए शो चाहता हूं "(ए, बी, सी)"। इसके अतिरिक्त, एन-टुपल्स की असंगतता वास्तव में कष्टप्रद है। हमें "एफएसटी" और "एसएनडी", कंट्रोल.आरो.फर्स्ट/सेकेंड, डेटा.एसेसर के ट्यूपल एक्सेसर्स इत्यादि का एक बेजिलियन वेरिएंट होना चाहिए। – Peaker

8

हास्केल ने उत्पादों को उठाने का चयन क्यों किया?

आप आलस्य या अस्वीकार करने वाले पैटर्न को अपील किए बिना इस डिज़ाइन विकल्प को उचित ठहरा सकते हैं। समान डिजाइन विकल्प बहुरूपता का समर्थन करने के कारणों के लिए एमएल बनाया गया है। पर विचार करें

fst (x, y) = x 
snd (x, y) = y 

अब अगर (a, (b, c))(a, b, c) के लिए वाक्यात्मक चीनी है, यह काफी मुश्किल है देखने के लिए विशेषज्ञ के लिए कैसे fst और snd इस प्रकार के तर्क के रूप में लेने के लिए। लेकिन

fst :: (a, (b, c)) -> a 
snd :: (a, (b, c)) -> (b, c) 

पूरी तरह से उचित हैं। चूंकि fst और snd जैसे पॉलिमॉर्फिक फ़ंक्शन इतने अविश्वसनीय रूप से उपयोगी हैं, दोनों हास्केल और एमएल प्रोग्रामर को (a, (b, c)) और ((a, b), c)(a, b, c) से अलग करने की क्षमता प्रदान करते हैं।

(उन लोगों के लिए जो लागत की परवाह करते हैं, प्रकार की संरचना प्रकार के आकार और इसके तत्वों को प्राप्त करने के लिए आवश्यक संकेतों (भार) की एक उचित मार्गदर्शिका भी है। कुछ प्रोग्रामर को ऐसी चीजों के बारे में जानना या जानना चाहते हैं और उनके ऊपर कुछ छोटी मात्रा में नियंत्रण रखना है।)

+3

आप जवाब दे रहे हैं क्यों (ए, बी, सी) isomorphic नहीं है (ए, (बी, सी)) (या, साथ काम करना आसान है, (ए, (बी, (सी,()))), लेकिन क्यों नहीं उत्पादों को अनलिफ्ट किया जाता है। लिफ्टिंग का अर्थ है एक अपरिवर्तित से अलग, बनाना (अपरिभाषित, अपरिभाषित)। – luqui

+1

@luqui: सहमत। मैंने प्रश्न के उस हिस्से को संबोधित करना चुना जो '(ए, (बी, सी)) और '(ए, बी, सी)' के बीच अर्थपूर्ण अंतर पर केंद्रित है। जब वह अंतर फोकस में लाया जाता है, तो उठाना स्पष्ट होता है --- tuples हटाए जाते हैं क्योंकि * हर * प्रकार उठाया जाता है। –

संबंधित मुद्दे