2010-05-08 13 views
6

का उपयोग कर यह एक व्यावहारिक रूप से महत्वपूर्ण मुद्दा नहीं है, लेकिन मैं एफ # में tacit programming का एक उदाहरण देखने के लिए मेरी बिंदु मुक्त कार्यों कई तर्क हो सकता है जहां चाहें शैली (किसी सूची या टपल के रूप में नहीं) ।मौन प्रोग्रामिंग एफ #

और दूसरी बात, ऐसे फ़ंक्शन जटिल डेटा संरचना में कैसे उपयोग कर सकते हैं। मैं इसे एफ # इंटरएक्टिव में आज़मा रहा हूं, लेकिन अभी तक कोई सफलता नहीं है।

मैंने कोशिश की, उदाहरण के लिए:

> (fun _ -> (fun _ -> (+))) 333 222 111 555 

सही तरीका है कि है?

और:

> (fun _ -> (fun _ -> (+))) "a" "b" "c" "d";; 

val it : string = "cd" 
+3

आपको "पॉइंटलेस" के बजाय "पॉइंट-फ्री" का उपयोग करना चाहिए। यह मानक शब्द है। :) –

उत्तर

4

एफ # बुनियादी कार्यों कि हास्केल (जिसका मुख्य कारण एफ # प्रोग्रामर आमतौर पर प्रोग्रामिंग की स्पष्ट शैली पसंद करते हैं और केवल सबसे स्पष्ट मामलों में pointfree शैली का उपयोग में उपलब्ध हैं के कुछ शामिल नहीं है , जहां यह पठनीयता को चोट नहीं पहुंचाता है)।

लेकिन अगर आप इस तरह कुछ बुनियादी combinators परिभाषित कर सकते हैं:

// turns curried function into non-curried function and back 
let curry f (a, b) = f a b 
let uncurry f a b = f (a, b) 

// applies the function to the first/second element of a tuple 
let first f (a, b) = (f a, b) 
let second f (a, b) = (a, f b) 

अब आप combinators का उपयोग कर दो तार की लंबाई को जोड़ने के लिए समारोह के रूप में इस लागू कर सकते हैं:

let addLengths = 
    uncurry (((first String.length) >> (second String.length)) >> (curry (+))) 

यह दो कार्यों का निर्माण जो String.length को टुपल के पहले/दूसरे तत्व पर लागू करता है, फिर उन्हें लिखता है और फिर + का उपयोग करके टुपल के तत्व जोड़ता है। पूरी चीज uncurry में लपेटी गई है, इसलिए आपको string -> string -> int प्रकार का कार्य मिलता है।

+0

मैंने इसे एफएसआई में चेक किया है और यह काम करता है! आपका बहुत बहुत धन्यवाद; बीटीडब्ल्यू, क्या आप समझा सकते हैं कि आप उस टुपल-फ़ंक्शन कंपोज़िशन सिंटैक्स पर कैसे पहुंचे? मेरा मतलब है '(पहले स्ट्रिंग। लम्बाई) >> (दूसरा स्ट्रिंग। लम्बाई)' यह मेरे लिए कुछ असामान्य दिखता है;) – Bubba88

+0

यह फ़ंक्शन संरचना '>>' का उपयोग करके हासिल किया गया है। उदाहरण के लिए 'f >> g' का अर्थ है कि एक तर्क 'x' के लिए, यह' g (f (x))' कॉल करेगा। उपर्युक्त मामले में, पहला फ़ंक्शन ('पहला स्ट्रिंग। लम्बाई') एक टुपल' स्ट्रिंग * स्ट्रिंग' को टुपल 'int * स्ट्रिंग' में बदल देता है और दूसरा फ़ंक्शन ('दूसरा स्ट्रिंग। लम्बाई') इसे 'int * में बदल देता है * int 'लंबाई शामिल है। –

+0

आप व्यावहारिक रूप से एफ # के लिए तीरों को कार्यान्वित कर रहे हैं; ठीक है, क्यों नहीं - तीरों का आविष्कार मोनैड और टैसिट प्रोग्रामिंग के संयोजन के रूप में किया गया है। – Dario

2

एफ # में, कार्यों की arity तय हो गई है, तो आप दोनों किसी भी ऑपरेटर op के लिए

(op) 1 2 

और

(op) 1 2 3 4 

लिखने के लिए सक्षम होने के लिए नहीं जा रहे हैं। यदि आप यही चाहते हैं तो आपको एक सूची या अन्य डेटा संरचना का उपयोग करने की आवश्यकता होगी। यदि आप नामित चर से बचने की कोशिश कर रहे हैं, तो आप हमेशा "1 + 2 + 3 + 4" कर सकते हैं। एफ # में संख्याओं की सूची जोड़ने का सबसे बेवकूफ तरीका List.sum [1;2;3;4] है, जो चर से बचाता है।