2010-05-06 11 views
6

मैं ग्राहम हटन के हास्केल पुस्तक के माध्यम से अपने रास्ते काम कर रहा हूँ, और अपने प्रत्यावर्तन अध्याय में, वह अक्सर "n + 1" पर पैटर्न से मेल खाता है, के रूप में:हास्केल "'एन + 1' और 'एन' 'में रिकर्सन मुहावरे क्यों नहीं है और' 'n' और 'n-1' 'नहीं है?

myReplicate1 0 _ = [] 
myReplicate1 (n+1) x = x : myReplicate1 n x 

क्यों कि और नहीं निम्न में से (1) कार्यात्मक रूप से समान और समझने के मामले में (2) अधिक सहज ज्ञान युक्त लगता है क्या प्रत्यावर्तन के साथ हो रहा है:

myReplicate2 0 _ = [] 
myReplicate2 n x = x : myReplicate2 (n-1) x 

वहाँ कुछ मैं यहाँ याद कर रहा हूँ है? या यह सिर्फ शैली का मामला है?

उत्तर

11

वे पहले समारोह में एन + के पैटर्न (जिन्हें टालना चाहिए!) हैं। दोनों कार्य एक ही चीज करते हैं, एन + के को नकारात्मक संख्याओं से मेल नहीं खाते को छोड़कर। बाद वाला, अनुशंसित है, और यदि आप उद्देश्य पर कोई नकारात्मक संख्या नहीं चाहते हैं, तो एन + के पैटर्न removed anyways होने के लिए शेड्यूल किए गए हैं।

तो नहीं, आप कुछ भी नहीं खो रहे हैं, और यह वास्तव में शैली का मामला है, लेकिन मैं शायद ही कभी जंगली में एन + के पैटर्न देखता हूं।

+1

दूसरे शब्दों में, यह शैली का विषय है, और पहली शैली को बहिष्कृत किया गया है।:) –

+0

यूप, बस इसे संपादित किया :) – LukeN

+2

वे वास्तव में वही नहीं हैं। एन + के पैटर्न नकारात्मक संख्या से मेल नहीं खाएंगे। – sepp2k

2

एन + के पैटर्न केवल n> = 0 से मेल खाते हैं। तो आपके myReplicate1 में n + 1 पैटर्न केवल सकारात्मक संख्या से मेल खाता है और ऋणात्मक एन एक गैर-संपूर्ण-पैटर्न अपवाद का कारण बनता है। MyReplicate2 में एक नकारात्मक n एक अनंत सूची बना देगा।

तो दूसरे शब्दों में आप एन + के पैटर्न का उपयोग कर सकते हैं जब आप पैटर्न को नकारात्मक संख्या से मिलान नहीं करना चाहते हैं, लेकिन इसके बजाए गार्ड का उपयोग करना स्पष्ट होगा।

-4
myReplicate n x = take n (repeat x) 

हो गया और किया गया। : डी

+6

हाँ, यह वास्तव में उपयोगी है ... – Joren

3

एन + के पैटर्न में भी विभिन्न कठोरता प्रभाव पड़ता है।

उदाहरण के लिए:

f (n+1) = Just n 
g n = Just (n-1) 

च अपनी पहली तर्क पर सख्त है, जी नहीं है। यह एन + के पैटर्न के साथ कुछ खास नहीं है लेकिन सभी पैटर्न पर लागू होता है।

5

मुझे लगता है कि इसके पीछे विचार यह है: हम इस तरह प्राकृतिक संख्या प्रकार का एक (धीमा) तरह परिभाषित कर सकते हैं:

data Natural = Zero | S Integer 

तो 0 == Zero, 1 == S Zero और इतने पर।

जब आप ऐसा करते, तो वह ऐसा मिलान पैटर्न का उपयोग करने के लिए प्राकृतिक हो जाता है:

myReplicate1 Zero _ = [] 
myReplicate1 (S n) x = x : myReplicate1 n x 

मुझे लगता है कि (और यह सिर्फ एक अनुमान है) कि n+1 पैटर्न के पीछे विचार यह एक तेजी से संस्करण की तरह है कि क्या है मैंने अभी वर्णन किया है। तो n+1 को पैटर्न S n जैसा माना जाना चाहिए। तो यदि आप इस तरह सोच रहे हैं, n+1 पैटर्न प्राकृतिक लगते हैं।

यह भी स्पष्ट करता है कि हमारे पास पक्ष की स्थिति क्यों है n>=0। हम Natural टाइप करके केवल n>=0 का प्रतिनिधित्व कर सकते हैं।

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