12

कार्य जब मैं गणितीय अर्थ में currying, आंशिक रूप से लागू करते हुए इन्फ़िक्स समारोह एक नई अवधारणा है जो मैं किताब Learn You a Haskell for Great Good में गोता के बाद पता चला था के बारे में एक छोटे से समझते हैं।इन्फ़िक्स साथ आंशिक आवेदन

को देखते हुए इस समारोह:

applyTwice :: (a -> a) -> a -> a 
applyTwice f x = f (f x) 

लेखक एक दिलचस्प तरीके से इसे इस्तेमाल करता है:

ghci> applyTwice (++ [0]) [1] 
[1,0,0] 
ghci> applyTwice ([0] ++) [1] 
[0,0,1] 

यहाँ मैं स्पष्ट रूप से देख सकते हैं कि जिसके परिणामस्वरूप समारोह विभिन्न मापदंडों पारित कर दिया था, जो नहीं होगा सामान्य माध्यम से यह एक करीबी फ़ंक्शन है (क्या यह होगा?) तो, हास्केल द्वारा इंफिक्स सेक्शनिंग पर कोई विशेष उपचार है? क्या यह सभी इंफिक्स कार्यों के लिए सामान्य है?


एक तरफ ध्यान दें के रूप में, इस हास्केल और कार्यात्मक प्रोग्रामिंग, के साथ अपने पहले सप्ताह है और मैं अभी भी किताब पढ़ रहा हूँ।

उत्तर

18

हां, आप आंशिक रूप से एक बाएं या दाएं ऑपरेंड को निर्दिष्ट करके इंफिक्स ऑपरेटर को आंशिक रूप से लागू कर सकते हैं, बस दूसरे को खाली छोड़ दें (बिल्कुल आपके द्वारा लिखे गए दो उदाहरणों में)।

तो, ([0] ++)(++) [0] या \x -> [0] ++ x (एक मानक समारोह में कोष्ठक के माध्यम से एक इन्फ़िक्स ऑपरेटर बदल सकते हैं तुम्हें याद) के रूप में ही है, जबकि (++ [0])\x -> x ++ [0] के बराबर है।

यह भी बैकटिक के उपयोग पता करने के लिए उपयोगी है, (``) तो आपको किसी इन्फ़िक्स ऑपरेटर में दो तर्क के साथ किसी भी मानक समारोह चालू करने के लिए सक्षम है जो:

Prelude> elem 2 [1,2,3] 
True 
Prelude> 2 `elem` [1,2,3] -- this is the same as before 
True 
Prelude> let f = (`elem` [1,2,3]) -- partial application, second operand 
Prelude> f 1 
True 
Prelude> f 4 
False 
Prelude> let g = (1 `elem`) -- partial application, first operand 
Prelude> g [1,2] 
True 
Prelude> g [2,3] 
False 
+0

तो, मैं हास्केल पता नहीं है, लेकिन है '(1 \' ELEM \ ')' 'ELEM 1' रूप में एक ही? – Neil

+1

@Neil: हाँ, यह है। –

+4

मुझे उस अनुभाग के रूप में '(++)' के बारे में सोचना पसंद है जहां आप दोनों इनपुट छोड़ देते हैं। –

5

सभी इन्फ़िक्स ऑपरेटरों में इस्तेमाल किया जा सकता हास्केल में अनुभाग - - को छोड़कर अनियमित अस्वीकृति के साथ अजीबता के कारण। इसमें बैकटिक्स के उपयोग से इंफिक्स में परिवर्तित गैर-इंफिक्स फ़ंक्शंस भी शामिल हैं। तुम भी एक दो तरफा खंड के रूप में सामान्य कार्यों में ऑपरेटरों बनाने के लिए तैयार करने के बारे में सोच सकते हैं:

(x + y) ->(+ y) ->(+)

धारा हैं (ज्यादातर, कुछ दुर्लभ कोने मामलों के साथ) सरल lambdas के रूप में इलाज किया।

\x -> (x/2)

और (2 /) एक गैर विनिमेय ऑपरेटर के साथ एक उदाहरण के लिए, \x -> (2/x) रूप में ही है: (/ 2) के समान है।

सैद्धांतिक रूप से सैद्धांतिक रूप से यहां कुछ भी दिलचस्प नहीं है। यह इंफिक्स ऑपरेटरों के आंशिक अनुप्रयोग के लिए सिर्फ वाक्य रचनात्मक चीनी है। यह अक्सर कोड थोड़ा सा सुंदर बनाता है। (निश्चित रूप से counterexamples हैं।)

+2

ध्यान दें कि "असामान्य अस्वीकृति के साथ अजीबता" इस तथ्य के कारण है कि यह संदिग्ध है कि '(- 1) 'को संख्यात्मक शाब्दिक -1 या फ़ंक्शन' \ x -> x - 1' के रूप में व्याख्या किया जाना चाहिए। हास्केल के रचनाकारों की पसंद इसे एक संख्यात्मक शाब्दिक के रूप में व्याख्या करना था, और 'subtract'' फ़ंक्शन प्रदान करना था, जो 'subtract x = \ y -> y - x' को संतुष्ट करता है। वे 'नकारात्मक' भी प्रदान करते हैं जो यूनरी माइनस फ़ंक्शन के रूप में कार्य करता है, यानी 'x = xx –

+0

@ChrisTaylor को अस्वीकार करें: लगभग। '(- x) '' x को अस्वीकार करने' के लिए अनुवाद करता है, इसलिए '(- 1)' 'नकारात्मक (-1) से' अस्वीकार (इंटेगर 1 से) '' है। बेशक, दोनों अच्छी तरह से व्यवहार किए गए 'न्यू' उदाहरणों के बराबर होना चाहिए। – hammar

+0

@hammar आह ठीक है, पीछे की तरफ तर्क का थोड़ा सा। सुधारों के लिए धन्यवाद! –

15

हाँ, यह काम पर the section syntax है।

अनुभाग (op e) या (e op) के रूप में लिखे गए हैं, जहां ओप एक बाइनरी ऑपरेटर है और ई एक अभिव्यक्ति है। अनुभाग बाइनरी ऑपरेटरों के आंशिक अनुप्रयोग के लिए एक सुविधाजनक वाक्यविन्यास हैं।

निम्नलिखित पहचान रखते हैं:

(op e) = \ x -> x op e 
(e op) = \ x -> e op x 
संबंधित मुद्दे