2010-06-04 16 views
16

मैं हास्केल में बड़े टुपल्स क्यों नहीं बना सकता? एक ट्यूपल आकार सीमा क्यों है?हास्केल ट्यूपल आकार सीमा

Prelude> (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) 

<interactive>:1:0: 
    No instance for (Show 
         (t, 
         t1, 
         t2, 
         ... 
         t23)) 
     arising from a use of `print' at <interactive>:1:0-48 
    Possible fix: 
     add an instance declaration for 
     (Show 
     (t, 
      t1, 
      t2, 
      ... 
      t23)) 
    In a stmt of a 'do' expression: print it 
+0

अपने कोड काम करता है? –

+12

बेशक यह करता है। लेकिन जब आप एसओ पर शिकायत कर सकते हैं तो त्रुटि संदेश क्यों पढ़ते हैं? – jrockway

+2

उन दुर्लभ मामलों में से एक जिनमें जीएचसी का सुझाव एक भयानक, भयानक विचार नहीं है। – luqui

उत्तर

21

ट्यूपल्स मनमानी लंबाई * हो सकते हैं, लेकिन शो, साथ ही साथ ईक, ऑर्ड, रीड, बाउंड इत्यादि केवल 15-टुपल तक ही चालू हो जाते हैं। Haskell 98 report §6.1.4 से:

वहाँ एक टपल के आकार पर कोई ऊपरी सीमा है, लेकिन कुछ हास्केल कार्यान्वयन tuples के आकार को सीमित कर सकते, और बड़े tuples के साथ जुड़े उदाहरणों की सीमा। हालांकि, प्रत्येक हास्केल कार्यान्वयन को ईक, ऑर्ड, बाउंड, रीड, और शो के उदाहरणों के साथ आकार 15 तक टुपल्स का समर्थन करना चाहिए। प्रस्तावना और पुस्तकालयों ऐसे की 7.

एक आकार अन्य लोगों ने कहा है, यदि आप एक 24 टपल की जरूरत है, आप एक बेहतर डेटा संरचना का उपयोग करना चाहिए करने के लिए tuples के लिए ज़िप के रूप में टपल कार्यों को परिभाषित।


संपादित करें: * GHC 6.12.2 के रूप में, एक टपल का अधिकतम आकार 62 है:

यदि आप इसके लिए एक उदाहरण के शो को परिभाषित
Prelude> :t (1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8) 

<interactive>:1:0: 
    A 64-tuple is too large for GHC 
     (max size is 62) 
     Workaround: use nested tuples or define a data type 
+0

मेरा मानना ​​है कि जीएचसी 60-कुछ तत्वों के लिए tuples को सीमित करता है, लेकिन भाषा मानक नहीं है। किसी भी तरह से, यह सिर्फ इतना मूर्खतापूर्ण है कि एक बड़ा tuple :) – copumpkin

+0

@pumpkin: आह सही। अपडेट किया गया। – kennytm

10

आप बड़ा tuples निर्माण कर सकते हैं, लेकिन आप उन्हें अपने आप को परिभाषित करने के लिए की आवश्यकता होगी। दूसरा, आपके पास शो इंस्टेंस नहीं है, इसलिए आपको इसके लिए एक उदाहरण लिखना होगा।

सामान्यतः, बड़े टुपल्स का उपयोग करना एक बुरा विचार है, जब आपको एक वेक्टर जैसे स्मार्ट डेटा प्रकार का उपयोग करना चाहिए। हम डिफ़ॉल्ट रूप से प्रदान किए गए आकार को सीमित करके उपयोग को हतोत्साहित करते हैं।

22

हास्केलर्स के बीच बहुत शोक, tuples रचनात्मक नहीं हैं। इसलिए किसी भी टाइपक्लास को ट्यूपल के हर आकार पर परिभाषित किया जाना चाहिए। मुझे लगता है कि रिपोर्ट कहती है कि उदाहरणों को केवल 10 या उससे कुछ तक परिभाषित करने की आवश्यकता है।

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

infixr 9 :* 
data a :* b = a :* !b 

फिर Ints की एक 5ple के प्रकार होगा:

Int :* Int :* Int :* Int :* Int :*() 

अंत में इकाई () कठोरता शुद्धता के लिए और साथ ही प्रकार के स्तर का तर्क के लिए महत्वपूर्ण है (आप wouldn ' टी अंतिम तत्व सख्त होना चाहते हैं और अन्य सभी आलसी होना चाहते हैं)।

घोषणा में बैंग नोट करें। इसका मतलब है कि एक ट्यूपल का दाहिना तरफ सख्त है, ताकि उपरोक्त 5ple जैसे प्रकार को स्मृति के एक हिस्से में फटकारा जा सके, ताकि बाद के तत्व पहले के मुकाबले ज्यादा महंगा न हों।

+0

आपका '(: *) 'मेरा क्वासिकोटर लागू करने के लिए बहुत अच्छा होगा। उद्धरण को मनमाने ढंग से बड़े tuples (उपयोगकर्ता आश्रित) होना चाहिए जो देखने के पैटर्न से वापसी जानकारी ले जाने के लिए विभिन्न प्रकार लौटाता है। घोंसले घोंसले से काफी बेहतर है। –

+0

लेकिन (ए: * बी): * सी एक जैसा नहीं है: * (बी: * सी) सही? तो नोटेशन और सख्तता के अलावा यह नेस्टेड tuples के समान है? – saolof

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