2009-11-30 18 views
8

आप "2 से विभाजित" की तरह के ऑपरेशन में पारित कर सकते हैं या "घटाना 1", जहाँ "1 जोड़ने" सिर्फ एक आंशिक रूप से लागू ऑपरेटर का उपयोग करने के लिए तर्क के साथ एक ऑपरेटर गुजर इस तरह दिखता है:एफ # एक समारोह

List.map ((+) 1) [1..5];; //equals [2..6] 
// instead of having to write: List.map (fun x-> x+1) [1..5] 

क्या हो रहा है 1 (+) पर लागू किया जा रहा है क्योंकि यह पहला तर्क है, और सूची आइटम दूसरे तर्क के रूप में लागू किया जा रहा है। अतिरिक्त और गुणा के लिए, यह तर्क आदेश कोई फर्क नहीं पड़ता।

मान लीजिए मैं हर तत्व से 1 घटाना (यह शायद एक आम शुरुआती गलती होगी) हैं:

List.map ((-) 1) [1..5];; //equals [0 .. -4], the opposite of what we wanted 

1 करने के लिए लागू किया जाता है (-) ने अपना पहला तर्क के रूप में है, इसलिए बजाय (list_item - 1), मैं (1 - list_item) प्राप्त करें। मैं नकारात्मक जोड़ने के बजाय सकारात्मक घटाने पर के रूप में यह पुनर्लेखन कर सकते हैं:

List.map ((+) -1) [1..5];; 
List.map (fun x -> x-1) [1..5];; // this works too 

मैं एक अधिक अर्थपूर्ण जिस तरह से यह लिखने के लिए, ((-) _ 1), जहां _ एक प्लेसहोल्डर को दर्शाता है, आर्क भाषा में की तरह की तरह कुछ के लिए देख रहा हूँ। इससे 1- पर दूसरा तर्क होगा, इसलिए List.map में, यह list_item - 1 का मूल्यांकन करेगा। तो अगर आप सूची में divide by 2 मैप करने के लिए चाहता था, आप लिख सकते हैं:

List.map ((/) _ 2) [2;4;6] //not real syntax, but would equal [1;2;3] 
List.map (fun x -> x/2) [2;4;6] //real syntax equivalent of the above 

यह किया या मैं (fun x -> x/2) उपयोग करने के लिए है हो सकता है? ऐसा लगता है कि प्लेसहोल्डर सिंटैक्स में सबसे नज़दीक हम एक नामांकित तर्क के साथ लैम्ब्डा का उपयोग करना चाहते हैं।

उत्तर

11

आप एक फ्लिप समारोह की तरह कुछ लिख सकता है,:

let flip f x y = f y x 

List.map (flip (-) 1) [2;4;6] 

, मैं वाक्य रचना गलत हो सकता है मैं एफ # में बहुत धाराप्रवाह नहीं कर रहा हूँ।

+8

आपका फ्लिप-फ़ंक्शन (बस साथ ही) को 'फ्लिप एफ एक्स वाई = एफ वाई एक्स' –

+0

के रूप में परिभाषित किया जा सकता है यह इनलाइनिंग के लिए एक अच्छा उम्मीदवार है। –

8

एफ #, ला लास्केल, न ही प्लेसहोल्डर तर्क (जाहिर तौर पर एक ला आर्क) में कोई 'ऑपरेशन सेक्शन' नहीं है। आप तर्कों के क्रम को उलट करने के लिए किसी अन्य उत्तर में सुझाए गए 'फ़्लिप' संयोजक का उपयोग कर सकते हैं और फिर आंशिक रूप से पहले (अब दूसरे) तर्क को लागू कर सकते हैं।

लेकिन जब तक आप कोड गोल्फ खेल रहे हैं मैं सिर्फ

fun x -> x/2 

का प्रयोग करेंगे, मैं बंद यहाँ आप कुछ भी खरीदता है एक और कुछ वर्ण दाढ़ी बनाने के लिए कोशिश कर नहीं लगता।

8

flip -solution Logan Capaldo ने सुझाव दिया भी एक ऑपरेटर (यहाँ >.) का उपयोग कर लिखा जा सकता है:

let (>.) x f = (fun y -> f y x) 
List.map (1 >. (-)) [2;4;6] 

या आप ऑपरेंड दूसरी तरह के आसपास पसंद करते हैं:

let (>.) f x = (fun y -> f y x) 
List.map ((-) >. 1) [2;4;6] 

संपादित करें : एक ऑपरेटर का उपयोग करना जो "प्लेसहोल्डर की तरह दिखता है" (यहां >-<) आपको अपने सुझाए गए वाक्यविन्यास के बहुत करीब आता है:

List.map ((-) >-< 1) [2;4;6] 

'_' दुर्भाग्य है (?) नहीं a valid operator symbol in F#

+1

:) स्माइली। :(frownie।: जीभ जीभ।> - <निराशा।> एक आंख बाहर poked। (एक आंख के साथ frownie बाहर poked। – Juliet