2010-01-24 13 views
17

मैं पढ़ रहा हूँ असली दुनिया हास्केल पृष्ठ 151, और मैं एक घंटे से अधिक के लिए निम्नलिखित मार्ग देखें किया है:टाइप क्लास के उदाहरणों पर समानार्थी शब्द का प्रभाव क्या है? जीएचसी में TypeSynonymInstances Pragma क्या करता है?

याद रखें कि स्ट्रिंग के लिए [चार], जो बारी में है एक पर्याय है प्रकार [ए] जहां चार पैरामीटर ए के लिए चार को प्रतिस्थापित किया गया है। हास्केल 98 के नियमों के अनुसार, जब हम एक उदाहरण लिखते हैं तो हमें टाइप प्रकार पैरामीटर की जगह टाइप करने की अनुमति नहीं है। दूसरे शब्दों में, हमारे लिए उदाहरण [ए] के लिए लिखना कानूनी होगा, लेकिन [char] के लिए नहीं। 16 टिप्पणियां 5335

यह बस में डूब नहीं है। the (free not pirated) copy of RWH chapter 6 पर घूर रहा देखने के अन्य बहुत से लोगों को वास्तव में इस के साथ पीड़ित हैं। मैं अभी भी टिप्पणी से यह समझ में नहीं आता ...

सबसे पहले, इस बारे में सब कुछ मुझे confuses, इसलिए यदि आपको लगता है आप इस मार्ग के बारे में कुछ भी व्याख्या कर सकते हैं कृपया, या TypeSynonymInstances कृपया।

यहाँ मेरी समस्या है:

  • Int एक डेटा निर्माता
  • String एक डेटा निर्माता हैऔरप्रकार पर्याय
अब

मैं नहीं कर सकता इन सवालों का जवाब दें:

  1. एक प्रकार का समानार्थी टाइप प्रकार के सदस्य को टाइप करने से रोकता है (मैं किसी कारण की तलाश कर रहा हूं जो शायद एक प्रकार के समानार्थी के संकलन या प्रत्यारोपण से संबंधित है)?
  2. भाषा के डिजाइनर क्यों नहीं, इस वाक्यविन्यास को नहीं चाहते (मैं व्यापक सिद्धांत या यूनिकोड गणित प्रतीकों का तर्क नहीं मांग रहा हूं)।
  3. मुझे यह लाइन "टाइप [ए] जहां टाइप पैरामीटर के लिए चार को प्रतिस्थापित किया गया है", और मैं जानना चाहता हूं कि मैं इसे "के लिए क्यों प्रतिस्थापित नहीं कर सकता हूं, जिस प्रकार int को प्रतिस्थापित किया गया है प्रकार पैरामीटर एक "

धन्यवाद!

+1

अपने स्वयं के कोड में, मैंने पाया है कि समानार्थी उदाहरणों का उपयोग करने का अर्थ है कि मैं वास्तव में 'टाइप' के बजाय 'न्यूटाइप' (और शायद सामान्यीकृत न्यूटाइप व्युत्पन्न) का उपयोग करना चाहता हूं। यदि आप 'टाइप' और' न्यूटाइप 'के बीच के अंतर से परिचित नहीं हैं, तो यह आपका पहला कदम होना चाहिए। – jrockway

उत्तर

27

मुझे लगता है कि इस मुद्दे का हिस्सा है कि दो, मोटे तौर पर संबंधित नहीं है, प्रतिबंध खेल में कर रहे हैं:

  • कोई प्रकार पर्याय उदाहरणों का मतलब है कि उदाहरणों केवल किया जा सकता है data या newtype के साथ घोषित चीजें, type नहीं। यह String को रोकता है, लेकिन [Char] नहीं।
  • कोई लचीला उदाहरण यह नहीं है कि उदाहरण केवल एक प्रकार का उल्लेख कर सकते हैं जो चर नहीं है, और केवल उस प्रकार का प्रकार एक प्रकार के कन्स्ट्रक्टर के रूप में उपयोग किया जा सकता है। यह Maybe Int और f Int को मना करता है, लेकिन Maybe a नहीं है।

यहाँ GHCi कहते हैं के बारे में Int, Char, और String है:

data Char = GHC.Types.C# GHC.Prim.Char# 
data Int = GHC.Types.I# GHC.Prim.Int# 
type String = [Char] 

Int और Char बिना प्रकार चर पैरामीटर दोनों सरल प्रकार के होते हैं; इसमें कोई भी प्रकार का कन्स्ट्रक्टर शामिल नहीं है, इसलिए आप उनके साथ बहुत आसानी से उदाहरण बना सकते हैं।

स्ट्रिंग, हालांकि, पर विफल रहता है दोनों की गणना करता है। यह एक प्रकार का समानार्थी है, जिसकी अनुमति नहीं है, और यह प्रकार का कन्स्ट्रक्टर भी गैर-परिवर्तनीय पर लागू होता है, अर्थात् सूची प्रकार कन्स्ट्रक्टर चार पर लागू होता है।

तुलना के लिए, ध्यान दें, कि [a], Maybe a, और Either a b मामलों में सभी मान्य हैं, लेकिन [Int]Maybe [a], और Either String a मना कर रहे हैं; उम्मीद है कि अब आप देख सकते हैं क्यों।

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

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
{-# LANGUAGE EmptyDataDecls #-} 
{-# LANGUAGE TypeSynonymInstances #-} 
{-# LANGUAGE FlexibleInstances #-} 
{-# LANGUAGE FlexibleContexts #-} 

तुम हमेशा packages that use pragmas को देखने जा सकते हैं। ऐसा लगता है कि लचीला उदाहरण, उचित मात्रा में उपयोग करते हैं, और "आदरणीय" पैकेज से (उदाहरण के लिए, पारसी के स्रोत में कुछ हिट हैं)।

+0

मुझे लगता है जैसे मैं अभी तक इस जवाब को पूरी तरह से समझ नहीं पा रहा हूं।लेकिन, यह बहुत अच्छी तरह से लिखा गया है कि मैं इसे अपना चुनावी उत्तर बनाना चाहता हूं, भले ही मुझे लगता है कि अभ्यास टुकड़ा अतिव्यापी प्रश्न के लिए आवश्यक था, इसलिए मैं इसके बिना सवाल फिर से लिखूंगा। –

+0

ठीक है, भले ही मैं वास्तव में सर्वोत्तम प्रथाओं से बात नहीं कर सकता, यह देखकर कि अन्य लोग क्या कर रहे हैं; मैंने अभी जवाब के बारे में कुछ जोड़ा है। –

+0

@ सीए.एमसीकैन - लाइन "फिर से जीएचसीआई इंट, चार और स्ट्रिंग के बारे में क्या कहती है", आपने उन प्रतिक्रियाओं को पूरा करने के लिए जीएचसीआई प्रॉम्प्ट पर क्या टाइप किया? –

0

इंट और स्ट्रिंग प्रकार हैं, डेटा कंसट्र्यूटर नहीं। स्ट्रिंग [चार] के लिए उपनाम होता है जिसे लिस्ट चार भी लिखा जा सकता है। एक डेटा कन्स्ट्रक्टर बस की तरह कुछ है, तो बस 3 प्रकार का मूल्य शायद इंट है।प्रकार पर्याय उदाहरणों यहां समझाए गए हैं:

http://hackage.haskell.org/trac/haskell-prime/wiki/TypeSynonymInstances

9

दरअसल, न तो Int और न ही String डेटा निर्माता हैं। जो है, आप उन्हें

> (Int 42, String "bob") 
<interactive>:1:1: Not in scope: data constructor `Int' 
<interactive>:1:9: Not in scope: data constructor `String' 

Int नाम एक नया, अलग, बीजीय डेटा प्रकार के एक मूल्य बनाने के लिए उपयोग नहीं कर सकते। String पहले से मौजूद प्रकार के लिए "टाइप-समानार्थी", या उपनाम है: [Char]। समस्या यह है कि हास्केल 98 कहता है कि आप एक उदाहरण घोषणा में एक प्रकार के पर्याय का उपयोग नहीं कर सकते हैं।

मैं नहीं कह सकता कि हास्केल 98 रिपोर्ट के लेखकों ने इस मामले में समानार्थी शब्द को प्रतिबंधित करना क्यों चुना है। उन पर काफी प्रतिबंध हैं। उदाहरण के लिए, उन्हें आंशिक रूप से लागू नहीं किया जा सकता है (यदि वे टाइप तर्क लेते हैं)। मुझे लगता है कि §4.2 के अंत में एक सुराग आता है।2:

प्रकार समानार्थी शब्द एक सुविधाजनक हैं, लेकिन सख्ती से वाक्यात्मक, तंत्र प्रकार हस्ताक्षर अधिक पठनीय बनाने के लिए। समानार्थी और इसकी परिभाषा को छोड़कर उदाहरण के प्रकार घोषणा (धारा 4.3.2) को छोड़कर पूरी तरह से अदलाबदल करने योग्य है।

संभवतः, प्रोग्राम संकलन के लिए एक दृष्टिकोण था, जिसके लिए इस वाक्य रचनात्मक विनिमयशीलता ने उदाहरणों के लिए समस्याएं पैदा की होंगी। शायद यह उदाहरणों कि वे संकुल से बाहर रिसाव से सबसे उल्लेखनीय पहलू के साथ क्या करना है ...

अपने पिछले प्रश्न के रूप में, मुझे विश्वास है कि स्पष्टीकरण दो बातें conflating है: 1) String[Char] के लिए एक प्रकार का पर्याय है, जो है बदले में अधिक सामान्य प्रकार [a] और 2 का एक विशेषज्ञता) कि बिना किसी पर्याय के, [Char] किसी उदाहरण के सिर में उपयोग नहीं किया जा सकता है।

इस दूसरी समस्या के प्रकार समानार्थी शब्दों के साथ कुछ लेना देना नहीं है, लेकिन उस उदाहरण के सिर में प्रकार के सभी प्रकार के पैरामीटर होना चाहिए, कन्स्ट्रक्टर प्रकार, ठोस प्रकार नहीं। यही है, आप कुछ कक्षाओं के लिए [Int] और [Char] के लिए अलग-अलग उदाहरण परिभाषित नहीं कर सकते हैं, आप केवल [a] उदाहरणों को परिभाषित कर सकते हैं। (याद रखें, सुविधाजनक वाक्यविन्यास के बावजूद, [] एक प्रकार का कन्स्ट्रक्टर है, और अंदर की चीज टाइप पैरामीटर है।)

फिर से, मुझे नहीं पता कि रिपोर्ट इन्हें प्रतिबंधित क्यों करती है, लेकिन मुझे संदेह है कि इसे भी करना है संकलन रणनीति के साथ। चूंकि उदाहरण के लिए जीएचसी की संकलन रणनीति इसे संभाल सकती है, इसलिए आप -XFlexibleInstances के माध्यम से जीएचसी में इस बाधा को आराम कर सकते हैं।

अंत में, मैंने देखा है कि दोनों एक्सटेंशन काफी सारे कोड में चालू हो गए हैं, लेकिन शायद हास्केल अनुभव वाले किसी व्यक्ति का वजन यह हो सकता है कि वे "सर्वोत्तम प्रथाओं" या नहीं हैं।

+0

एक और महान लेखन, एक गुच्छा धन्यवाद, आपका ज्ञान StackOverflow के लिए एक संपत्ति है। त्वरित सवाल हालांकि: 'यानी, आप कुछ वर्गों के लिए [Int] और [char] के लिए अलग-अलग उदाहरण परिभाषित कर सकते हैं, क्या यह' can', या 'can't 'पढ़ना नहीं है, क्योंकि यह बाकी के साथ संघर्ष करता है अनुच्छेद के। मुझे लगता है [Int], और [char], ठोस प्रकार हैं, जिसका अर्थ यह होगा कि वे प्रकार के वर्गों के उदाहरण के रूप में काम नहीं करेंगे? –

+0

अच्छी पकड़- तय! – MtnViewMark

1

हास्केल 98

  1. एक उदाहरण सिर प्रपत्र सी (टी u1 ... ब्रिटेन), जहां टी एक प्रकार निर्माता एक डेटा या newtype घोषणा से परिभाषित किया गया है होना चाहिए (TypeSynonymInstances देखें) और ui विशिष्ट प्रकार चर हैं, और
  2. संदर्भ में प्रत्येक दावे में फॉर्म सी 'वी होना चाहिए, जहां v ui में से एक है।

तो यह उपयोग करने के लिए instance ClassName TypeConstructor where और TypeConstructor किया जाना चाहिए जैसे Int, Double या [a] मान्य है, सुनिश्चित करें कि केवल एक प्रकार निर्माता शामिल किया जा सकता बनाने के !!

Btw, [] प्रकार निर्माता है, इसलिए [TypeConstructor] नहीं किया जा सकता लेकिन [NewType] और [TypeVariable] अनुमति दी जाती है।

यह एक बाधा है हास्केल है, और हम इसे FlexibleInstances सक्षम करके इससे बच सकते हैं।

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