2010-12-15 17 views
43

हम एक समारोह है कि 1 से एक सीमा के प्रत्येक तत्व बढ़ जाती मैप करना चाहते हैं, तो हमCurrying घटाव

map (\x -> x + 1) [1..5] 

लिख सकता है लेकिन मुझे लगता है कि ज्यादातर लोगों को बस के लिए

map (+1) [1..5] 
बजाय

जाना होगा। लेकिन यह स्पष्ट रूप से (-1) के साथ काम नहीं करता है क्योंकि यह नकारात्मक है।

तो पहली बात यह है कि मन के लिए आया था

map (+(-1)) [1..5] 

था जो भावना पर विचार कैसे घटाव प्रस्तावना (x - y = x + negate y) में परिभाषित किया गया है होगा, लेकिन मेरे लिए थोड़ा अजीब लग रहा है। मैं तब

map (flip (-) 1) [1..5] 

यह किसी भी तरह से मेरे लिए बेहतर दिखता है, लेकिन शायद थोड़ा जटिल है।

अब मुझे यह कोई बड़ा सौदा नहीं है, लेकिन मुझे आश्चर्य है कि क्या मुझे यह लिखने का एक और स्पष्ट तरीका याद आ रहा है? यदि नहीं, तो आप किस 2 तरीके से पसंद करेंगे? मैं वास्तव में सिर्फ पूछ रहा हूं क्योंकि अक्सर इस तरह के छोटे विवरण हैं जो आपके कोड को अधिक मूर्खतापूर्ण बनाते हैं और इसलिए अन्य डेवलपर्स के लिए सुखद होते हैं जिन्हें इसे पढ़ना होता है।

समाधान

अब मुझे मिल गया है कि उत्तर के एक जोड़े, मुझे लगता है कि मेरी निजी पसंदीदा

map (subtract 1) [1..5] 

द्वारा

map pred [1..5] 

पीछा किया है ज्यादातर क्योंकि पहले एक वास्तव में स्पष्ट है और किसी को भी अनुमान लगाने की आवश्यकता नहीं है/pred का अर्थ है (पूर्ववर्ती)।

+3

लिख सकते हैं एक छोटा सा ध्यान दें: समस्या currying नहीं है, यह ऑपरेटर अनुभाग वाक्य रचना है।'(-) 1' आंशिक रूप से curried' -' फ़ंक्शन को आंशिक रूप से लागू करने के लिए एक (वाक्य रचनात्मक रूप से वैध) तरीका है। –

+3

मैं इसके लिए एक शीर्षक के साथ संघर्ष कर रहा था और कुछ भी बेहतर नहीं हो सका। इसके अलावा 'नक्शा ((-) 1) [1..5]' काम नहीं करता है, इसलिए फ्लिप के साथ संस्करण। –

+0

यदि वे इंटीग्रल हैं, और आप केवल 1 घटा देना चाहते हैं, तो क्यों न करें 'नक्शा पूर्व' –

उत्तर

38

आप - के बजाय subtract फ़ंक्शन का उपयोग करता है, तो आप सही अनुभाग घटाव करना चाहते हैं कर सकते हैं:

map (subtract 1) [1..5] 
+1

वह स्पष्ट चीज़ का प्रकार था जिसका मतलब था, धन्यवाद! कभी-कभी आप पेड़, होगल और सभी के लिए जंगल नहीं देख सकते हैं। –

1

मैं map (\x -> x - 1) [1..5] प्रोग्रामर की मंशा बेहतर पहुंचाता है, क्या क्या से घटाया जा रहा है के बारे में कोई संदेह नहीं है वहाँ के बाद से लगता है। मुझे आपका पहला समाधान भी मिल रहा है, map (+(-1)) [1..5], पढ़ने के लिए भी आसान है।

8

- के बाद से दोनों इन्फ़िक्स घटाएं व उपसर्ग निगेट, आप (*x) (एक इन्फ़िक्स ऑपरेटर जहां * है और x एक मूल्य) का उपयोग नहीं कर सकते हैं - के लिए वाक्य रचना है। सौभाग्य से प्रलोड negate और subtract के साथ आता है, जो \x -> -x और \x y -> y-x क्रमशः है, ताकि आप उन दोनों का उपयोग कर सकें जहां आपको दोनों के बीच अंतर करने की आवश्यकता है।

+0

'घटाना 'वास्तव में' x x -> y - x' है। – nyuszika7h

+0

@ nyuszika7h धन्यवाद, मैंने इसे ठीक किया। – HaskellElephant

2

मुझे subtract पसंद नहीं है क्योंकि यह उलझन में है। मेरा सुझाव था

minus :: Num n => n -> n -> n 
minus = (-) 
infixl 6 `minus` 

तो फिर तुम

map (`minus` 1) [1..5] 
+2

मैं सिर्फ '(+ (- 1)) पसंद करता हूं। नए नाम के साथ चाल अच्छी है, लेकिन यह एक मूल्यवान नाम लेता है। बहुत खराब '' ('-' 1)' 'अमान्य वाक्यविन्यास है। –

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