2015-08-03 5 views
10

GHC user guide से यह PBangPat हो सकता है सबसे Pat की तरह लगता है, लेकिन वहाँ कुछ अपवाद हैं। जैसे मॉड्यूल में शीर्ष-स्तरीय बैंग (जैसे !main) और x : !xsx : (!xs) parses धन्यवाद @chi को पार्स करने में विफल रहता है। बैंग्स को कहां जोड़ा जा सकता है इसके बारे में औपचारिक विनिर्देश क्या है? मैंने उपयोगकर्ता मार्गदर्शिका और रिपोर्ट के कुछ अध्यायों में देखा है लेकिन कुछ भी नहीं मिला है।BangPatterns कहां दिखाए जा सकते

+2

अच्छा सवाल है, हालांकि संदेह है कि यह शायद सबसे अच्छा है कि बैंगपेटर्न का उपयोग न करें बल्कि पुराना 'सीक'। – leftaroundabout

+3

'x: (! Xs)' parses – chi

उत्तर

6

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

दोनों स्रोत स्पष्ट रूप से उल्लेख करते हैं कि मॉड्यूल के शीर्ष स्तर पर एक बैंग पैटर्न की अनुमति नहीं है।

pat ::= !pat 

यह:

हम पैटर्न की वाक्य रचना के लिए एक एकल नई उत्पादन जोड़ें:

x : !xs का सवाल है, उपयोगकर्ता मार्गदर्शिका इस धमाके के पैटर्न के सिंटैक्स के बारे में क्या कहना है हास्केल 2010 रिपोर्ट के साथ संयोजन में पढ़ा जाना चाहिए:

pat ::= lpat qconop pat 
     | lpat 

lpat ::= apat 
     | - (integer | float) 
     | gcon apat_1 ... apat_k 

apat ::= var [ @ apat] 
     | ... 
     | (pat) 
     | ... 

इन नियमों x : !xs वास्तव में पार्स चाहिए के अनुसार (के बाद से !xs एक pat है, पूरी बात lpat qconop pat है)। तो या तो उपयोगकर्ता की मार्गदर्शिका (और हैकेल-प्राइम प्रस्ताव) गलत है या इस बिंदु पर जीएचसी गलत है।

मेरा मानना ​​है कि अभ्यास में जीएचसी द्वारा स्वीकार किए गए वाक्यविन्यास ऑपरेटर ! के एक भाग के रूप में (!x) को व्याख्या करने सहित "वैध अभिव्यक्ति की तरह दिखता है"। उदाहरण के लिए (! Just x) एक पैटर्न के रूप में स्वीकार किया जाता है लेकिन (! ! x) नहीं है।

+2

दरअसल [उपयोगकर्ता की मार्गदर्शिका का प्रासंगिक अनुभाग] (https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/bang-patterns.html#bang -पर्टर्न-सेम) इतना पुराना है कि यह * हास्केल 98 * रिपोर्ट से जुड़ा हुआ है, और उस समय बीएनएफ व्याकरण ने प्राथमिकता को अलग-अलग व्यवहार किया था। [विशेष रूप से पैटर्न के लिए] (https://www.haskell.org/onlinereport/exps.html#sect3.17.1), 'pat :: =! Pat' जोड़ना * सबसे कम प्राथमिकता * में जोड़ना है। –

+0

हालांकि, इस पढ़ने से '(!! X) '* * काम करना चाहिए लेकिन परेशान नहीं है। –

+0

@ ØrjanJohansen, ओह अच्छा बिंदु। मैंने रिपोर्ट के लिंक का पालन करने का प्रयास नहीं किया क्योंकि मेरे पास पहले से ही एक अन्य टैब में 2010 की रिपोर्ट खुल गई थी। इससे विवरण वास्तविकता के करीब आता है, हालांकि आप कहते हैं कि अभी भी वही नहीं है। –

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