2012-04-10 14 views
11

ऐसा लगता है कि ये सभी संबंधित हैं। अंतर क्या है?पाइपिंग, संरचना, और करी

+5

क्या आपके पास कोई ऐसा उदाहरण है जिसे उचित दृष्टिकोण ढूंढने की आवश्यकता है? आपका सवाल काफी व्यापक है। – pad

+2

यह "प्रोग्रामर" एसओ साइट पर अधिक फिट हो सकता है। –

+0

मैं पैड से सहमत हूं - यह एक काफी खुले अंत प्रश्न (टॉमस 'और डैनियल के जवाब नहीं हैं)। –

उत्तर

37
  • पाइपिंग कुछ मूल्य (बस यूनिक्स में पाइपिंग की तरह) पर कार्रवाई के अनुक्रम प्रदर्शन करने के लिए प्रयोग किया जाता है। प्रत्येक फ़ंक्शन में इनपुट पिछले फ़ंक्शन का आउटपुट होता है। जाहिर है कि प्रत्येक समारोह में एक ही तर्क लेना आवश्यक है।

  • संरचना (<</>>) यह अनुक्रम में दो कार्यों कॉल में समान है (यानी, प्रथम के उत्पादन में दूसरे के लिए इनपुट है), लेकिन यह एक समारोह के बजाय रिटर्न तुरंत अनुक्रम लागू की।

  • Currying एन आर्ग

तो के एक समारोह के लिए 1 को एन -1 आर्ग लगाने से एक नया कार्य बनाता है, संरचना और currying पाइप के लिए प्रयोग किया जाता है, जबकि कार्यों बनाने के लिए उपयोग किया जाता है मंगलाचरण। रचना और करीकरण नए कार्यों को बनाने के तरीके में भिन्न होते हैं (तर्क बनाम चेन लागू करके)।

25

डैनियल क्या लिखा है के अलावा, वहाँ पाइपिंग (|> और <| संचालकों) और समारोह संरचना (>> और << ऑपरेटरों) के बीच एक बहुत करीबी पत्राचार है।

आप पाइपिंग का उपयोग करते हैं कार्यों के एक seqence के लिए कुछ डेटा पारित करने के लिए:

nums |> Seq.filter isOdd 
    |> Seq.map square 
    |> Seq.sum 

... तो यह एक फ़ंक्शन का इनपुट गुजर के बराबर है समारोह रचना का उपयोग कर प्राप्त:

let composed = 
    Seq.filter isOdd 
    >> Seq.map square 
    >> Seq.sum 

composed nums 

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

// Explicit function declaration 
foo (fun x -> x |> bar |> goo) 

// Equivalent using function composition 
foo (bar >> goo) 
संबंधित मुद्दे