एन + के पैटर्न क्या हैं? इस पर एक हंस लें:
$ 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
और बस हो गया। मैं वास्तव में अब कर रहा हूँ।
शायद * क्यों * एन + के पैटर्न के संकेत के लिए इस उत्कृष्ट ब्लॉग पोस्ट को देखें: http://blog.sigfpe.com/2007/07/data-and-codata.html – jberryman
अभी भी जो लोग अभी भी एन + के-पैटर्न (मैं आपको देख रहा हूं, एरिक मीजर) का उपयोग करना चाहता हूं, वहां '-XNPlusKPatterns' या '{- # LANGUAGE NPlusKPatterns # -}' – tlo