2010-09-20 11 views
50

जब Wikipedia's entry on Haskell 2010 पढ़ने मैं इस भर में ठोकर खाई:"एन + के पैटर्न" क्या हैं और उन्हें हास्केल 2010 से क्यों प्रतिबंधित किया गया है?

-- using only prefix notation and n+k-patterns (no longer allowed in Haskell 2010) 
factorial 0 = 1 
factorial (n+1) = (*) (n+1) (factorial n) 

क्या वे "n + K पैटर्न" से क्या मतलब है? मुझे लगता है कि यह दूसरी पंक्ति है, लेकिन मुझे यह नहीं मिलता कि इसमें क्या गलत हो सकता है। क्या कोई बता सकता है कि वहां क्या मुद्दा है? हास्केल 2010 में इन एन + के पैटर्न की अनुमति क्यों नहीं है?

+0

शायद * क्यों * एन + के पैटर्न के संकेत के लिए इस उत्कृष्ट ब्लॉग पोस्ट को देखें: http://blog.sigfpe.com/2007/07/data-and-codata.html – jberryman

+6

अभी भी जो लोग अभी भी एन + के-पैटर्न (मैं आपको देख रहा हूं, एरिक मीजर) का उपयोग करना चाहता हूं, वहां '-XNPlusKPatterns' या '{- # LANGUAGE NPlusKPatterns # -}' – tlo

उत्तर

58

एन + के पैटर्न क्या हैं? इस पर एक हंस लें:

$ ghci 
GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Loading package ffi-1.0 ... linking ... done. 
Prelude> let f 0 = 0 ; f (n+5) = n 
Prelude> :t f 
f :: (Integral t) => t -> t 
Prelude> f 0 
0 
Prelude> f 1 
*** Exception: <interactive>:1:4-24: Non-exhaustive patterns in function f 

Prelude> f 2 
*** Exception: <interactive>:1:4-24: Non-exhaustive patterns in function f 

Prelude> f 3 
*** Exception: <interactive>:1:4-24: Non-exhaustive patterns in function f 

Prelude> f 4 
*** Exception: <interactive>:1:4-24: Non-exhaustive patterns in function f 

Prelude> f 5 
0 
Prelude> f 6 
1 

वे मूल रूप से पैटर्न मिलान पर एक बहुत ही विशेष मामले जो केवल नंबरों पर काम करते हैं और जो करते हैं ... अच्छी तरह से, चलो सिर्फ विनम्र हो और यह "अप्रत्याशित बातों" उन लोगों के लिए फोन कर रहे हैं संख्या।

यहां मेरे पास एक कार्य f है जिसमें दो खंड हैं। पहला खंड 0 और केवल 0 से मेल खाता है। दूसरा खंड किसी भी प्रकार के इंटीग्रल से मेल खाता है जिसका मूल्य 5 या उससे अधिक है। बाध्य नाम (n, इस मामले में) आपके पास शून्य से गुजरने वाले नंबर के बराबर मान है। क्यों उन्हें हास्केल 2010 से हटा दिया गया है, मुझे उम्मीद है कि आप अभी कुछ सोच के साथ कारण देख सकते हैं। (संकेत: "कम से कम आश्चर्य की बात है के सिद्धांत" पर विचार करें और यह या कैसे यहाँ पर लागू नहीं हो सकता है।)


संपादित जोड़ने के लिए:

एक प्राकृतिक सवाल अब उठता है कि इन निर्माणों वर्जित किया गया है "आप उन्हें बदलने के लिए क्या उपयोग करते हैं?"

$ ghci 
GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Loading package ffi-1.0 ... linking ... done. 
Prelude> let f 0 = 0 ; f n | n >= 5 = n - 5 
Prelude> :t f 
f :: (Num t, Ord t) => t -> t 
Prelude> f 0 
0 
Prelude> f 1 
*** Exception: <interactive>:1:4-33: Non-exhaustive patterns in function f 

Prelude> f 2 
*** Exception: <interactive>:1:4-33: Non-exhaustive patterns in function f 

Prelude> f 3 
*** Exception: <interactive>:1:4-33: Non-exhaustive patterns in function f 

Prelude> f 4 
*** Exception: <interactive>:1:4-33: Non-exhaustive patterns in function f 

Prelude> f 5 
0 
Prelude> f 6 
1 

आप प्रकार के बयानों से ध्यान देंगे कि इन ठीक बराबर नहीं हैं, लेकिन एक गार्ड के उपयोग के "पर्याप्त बराबर है।" अभिव्यक्ति में n-5 का उपयोग किसी भी कोड में थकाऊ और त्रुटि-प्रवण हो सकता है जो इसे एक से अधिक स्थानों में उपयोग करता है। इस सवाल का जवाब यह की तर्ज पर एक where खंड का उपयोग करने के होगा:

Prelude> let f 0 = 0 ; f n | n >= 5 = n' where n' = n - 5 
Prelude> :t f 
f :: (Num t, Ord t) => t -> t 
Prelude> f 0 
0 
Prelude> f 5 
0 
Prelude> f 6 
1 

where खंड आप गलत लिख के जोखिम के बिना कई स्थानों में गणना अभिव्यक्ति का उपयोग करने देता है। फ़ंक्शन परिभाषा में दो अलग-अलग स्थानों में सीमा मान (5 इस मामले में) को संपादित करने की परेशानी अभी भी है, लेकिन व्यक्तिगत रूप से मुझे लगता है कि यह संज्ञानात्मक समझ में वृद्धि के लिए भुगतान करने के लिए एक छोटी सी कीमत है।


इसके अलावा जोड़ने के लिए संपादित:

आप let भाव पसंद करते हैं where से अधिक खंड, इस एक विकल्प है:

Prelude> let f 0 = 0 ; f n | n >= 5 = let n' = n - 5 in n' 
Prelude> :t f 
f :: (Num t, Ord t) => t -> t 
Prelude> f 0 
0 
Prelude> f 5 
0 

और बस हो गया। मैं वास्तव में अब कर रहा हूँ।

+1

+2 (हाँ दो) मेरा वोट इस पर जाता है जवाब क्योंकि इसे 'यह क्या है' और 'यह क्यों है' पूरी तरह से कवर के साथ एक उत्कृष्ट तरीके से समझाया गया था। –

+0

बढ़िया! धन्यवाद!! –

+0

ग्रेट उत्तर! मैं हास्केल के लिए काफी नया हूं इसलिए मेरा अगला प्रश्न होगा: टाइप चेकर उस पैटर्न को क्यों अनुमति देता है और कम से कम एक चेतावनी जारी नहीं करता है? इस मामले में यह पता होना चाहिए कि उस कोड में कुछ मामलों की कमी है। – futtetennista

4

ट्रिनिथिस द्वारा प्रदान किया गया लिंक सही है; एन + के पैटर्न अब हास्केल स्पेक में शामिल नहीं हैं।

सामान्य रूप से एन + के पैटर्न पर अधिक पृष्ठभूमि के लिए, इस पृष्ठ को pattern matching पर इस पृष्ठ के नीचे 3/5 वें स्क्रॉल करें, या इस छोटे post पर देखें।

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