फ़ंक्शन संरचना दो या दो से अधिक कार्यों को एक साथ करने का एक तरीका है। इसे अक्सर खोल पाइपिंग की तुलना में किया जाता है। उदाहरण के लिए, एक यूनिक्स शैली खोल में, आप की तरह
cat foo.txt | sort -n | less
यह cat
चलाता है, sort
को इसके उत्पादन फ़ीड, और less
है कि से उत्पादन फ़ीड कुछ लिख सकते हैं।
कड़ाई से, यह हास्केल $
ऑपरेटर की तरह है। आप
sum $ sort $ filter (> 0) $ my_list
पर ध्यान दें कि खोल उदाहरण के विपरीत, यह दाएं से बाएं पढ़ता है। तो हम इनपुट के रूप में my_list
के साथ शुरू करते हैं, फिर हम filter
चलाते हैं, फिर हम sort
इसे चलाते हैं, और फिर हम sum
की गणना करते हैं।
फ़ंक्शन संरचना ऑपरेटर, .
, कुछ ऐसा ही करता है। उपरोक्त उदाहरण संख्या उत्पन्न करता है;
sum . sort . filter (> 0)
सूचना है कि हम वास्तव में इस में एक सूची फ़ीड नहीं किया: नीचे दिए गए उदाहरण एक समारोह पैदा करता है। इसके बजाए, हमने अभी एक नया फ़ंक्शन बनाया है, और हम उस फ़ंक्शन में कई अलग-अलग सूचियां खिला सकते हैं।उदाहरण के लिए, आप इस समारोह का नाम हो सकता है:
my_function = sum . sort . filter (> 0)
या आप एक और कार्य करने के लिए एक तर्क के रूप में यह पारित हो सकता है:
map (sum . sort . filter (> 0)) my_lists
आप मूल रूप से इसे कहीं भी उपयोग कर सकते हैं कि आप समारोह के किसी भी अन्य प्रकार का उपयोग कर सकते हैं । यह कहने का एक तेज़ और पठनीय तरीका है "मैं इन कार्यों को एक साथ जोड़ना चाहता हूं"।
के लिए +1 आपको परिभाषा में इनपुट पैरामीटर दिखाने की आवश्यकता नहीं है? उदाहरण के लिए। आप कैसे 'myOdd x = नहीं लिखते हैं। यहां तक कि एक्स'? – unclerojelio
@unclerojelio इसे पॉइंट-फ्री शैली कहा जाता है। किसी दिए गए तर्क के परिणाम के संदर्भ में 'myOdd' को परिभाषित करने के बजाय ("दिया गया' x',' myOdd' '(नहीं।) X' "के समान मान देता है), यह वास्तव में इसके संदर्भ में परिभाषित किया गया है है ("myOdd' वह फ़ंक्शन है जिसके परिणामस्वरूप ''''' के साथ बना नहीं है")। – chepner