2012-10-11 11 views
20

संभव डुप्लिकेट:
Currying subtractionघटाव के लिए (+1) के बराबर क्या है, क्योंकि (-1) को ऋणात्मक संख्या के रूप में देखा जाता है?

मैं अपनी पहली Haskell परियोजना है कि एक ट्यूटोरियल से नहीं है शुरू कर दिया, और निश्चित रूप से मैं सबसे सरल बातों पर ठोकर। (-1) जो नकारात्मक रूप में देखा जाता रहा इस्तेमाल किया था:

moveUp y = modifyMVar_ y $ return . (+1) 
moveDn y = modifyMVar_ y $ return . (-1) 

यह मुझे समझने के लिए क्यों मेरे कोड संकलन नहीं होगा कुछ समय निकाला:

मैं निम्नलिखित कोड है। ऋण को ब्रैकेट करने से यह मदद नहीं करता है क्योंकि यह इसे उपसर्ग करता है और 1 का पहला पैरामीटर बनाता है।

संक्षेप में, इसका बिंदु मुक्त संस्करण क्या है?

dec :: Num a => a -> a 
dec x = x - 1 
+0

http://stackoverflow.com/questions/4454559/currying-subtraction –

उत्तर

25

मेरा मानना ​​है कि आप the conveniently-named subtract function चाहते हैं, जो वास्तव में कारण है कि आप की खोज की है के लिए मौजूद है:

subtract :: Num a => a -> a -> a 

flip (-) के रूप में ही।

क्योंकि - विशेष रूप से हास्केल व्याकरण में इलाज किया जाता है, (- e) एक अनुभाग नहीं है, लेकिन उपसर्ग निषेध का एक आवेदन है। हालांकि, (subtract exp) अस्वीकृत अनुभाग के बराबर है।

आप subtract की तरह एक समारोह का उपयोग किए बिना यह pointfree लिखना चाहते थे, तो आप, flip (-) इस्तेमाल कर सकते हैं के रूप में Prelude प्रलेखन का उल्लेख है। लेकिन यह है ... थोड़े बदसूरत।

4

आप subtract फ़ंक्शन (जो मानक प्रीलूड में है) का उपयोग कर सकते हैं।

moveDn y = modifyMVar_ y $ return . (subtract 1) 

तुम भी पैरामीटर - लेता को पुन: व्यवस्थित करने के लिए फ्लिप उपयोग कर सकते हैं।

moveDn y = modifyMVar_ y $ return . (flip (-) 1) 
+0

+1 देखें ... मेरा संस्करण फ्लिप नहीं था ... –

2

तो उपर्युक्त subtract भी वर्बोज़ है, तो आप (+ (-1)) या (-1 +) की तरह कुछ की कोशिश कर सकते।

+2

इस कोड कोड सममित की मेरी दो पंक्तियां बनाने का लाभ है, जैसा कि (+1) और (घटाएं 1) तरफ से अच्छी तरफ न दिखें। हालांकि, यह वास्तव में (-) को कॉल नहीं करता है। बेशक यह न्यूम के साथ पूरी तरह से ठीक है, लेकिन अगर मैं सेट के साथ काम कर रहा था जो काम नहीं करेगा: तत्व -1 को एक सेट में जोड़ना तत्व को हटाने जैसा नहीं है 1. घटाव अधिक सामान्य है, लेकिन मैं आपके प्रस्ताव का उपयोग करूंगा । हालांकि, मुझे इस प्रश्न के लिए घटाना या फ़्लिप का उपयोग स्वीकार करना होगा, क्योंकि यह एक अधिक सीधा जवाब है। – Niriel

+0

मुझे यकीन नहीं है कि मैं आपकी शिकायत को समझता हूं, क्योंकि (-) केवल न्यू के उदाहरणों पर परिभाषित किया गया है। (यदि आपके पास गैर-कम्यूटिव नंबर थे तो यह एक मुद्दा होगा।) – Fixnum

+6

चूंकि आपकी संख्या 'एनम' के उदाहरण प्रतीत होती है, इसलिए आप इसके बजाय 'succ' और' pred' का उपयोग भी कर सकते हैं। – Fixnum

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