2012-03-10 10 views
5

में इसके वैकल्पिक तर्क मानते हैं कि एक फ़ंक्शन bind में एक लेबल तर्क, वैकल्पिक तर्क और अनसुलझा तर्क हैं, और आप m विधि को परिभाषित करना चाहते हैं जो bind के अनबमित तर्क लागू करता है और आंशिक रूप से लागू फ़ंक्शन देता है, ताकि m का उपयोगकर्ता bind के लेबल किए गए या वैकल्पिक तर्क लागू कर सकते हैं। आप यह कैसे करते हैं? बस method m = bind a b [...] z लिखने से संकलक को लगता है कि वैकल्पिक तर्क छोड़े गए हैं।फ़ंक्शन को कैसे घुमाएं w.r.t. OCaml

उत्तर

11

वैकल्पिक तर्कों की स्थिति (फ़ंक्शन घोषणा या फ़ंक्शन प्रकार में) महत्वपूर्ण है: वे केवल तब लागू होते हैं जब अगला गैर-वैकल्पिक तर्क लागू होता है।

आप एक पैरामीटर p का आंशिक आवेदन एक वैकल्पिक पैरामीटर ?o लागू नहीं करना चाहते हैं, समारोह घोषणा में p के बाद ?o डाल दिया।

कंट्रास्ट

# let f ?o p ~z =();; 
val f : ?o:'a -> 'b -> z:'c -> unit = <fun> 
# f 1;; 
- : z:'_a -> unit = <fun> (* ?o applied *) 

साथ:

# let f p ?o ~z =();; 
val f : 'a -> ?o:'b -> z:'c -> unit = <fun> 
# f 1;; 
- : ?o:'_a -> z:'_b -> unit = <fun> (* ?o not applied *) 

आप परिभाषा क्रम बदलने के लिए, या आंशिक रूप से सभी गैर वैकल्पिक पैरामीटर लागू करना चाहते हैं नहीं करना चाहते हैं, तो आप स्पष्ट रूप से कब्जा करने के लिए की जरूरत है वैकल्पिक पैरामीटर जो पूरी तरह से पारित किए जाएंगे:

# (fun ?o() -> f ?o 1 ~z:2);; 
- : ?o:'a -> unit -> unit = <fun> 

मामले में आप इसे से परिचित नहीं थे, कॉल स्थल पर ?o वाक्य रचना इस बात के लिए बहुत आसान है: यह एक 'a option लेता है और सही बात करता है पारदर्शी रूप से लिए, एक वैकल्पिक तर्क पारित है कि क्या लागू किया है या नहीं, कॉल प्राप्त करने वाला।

मैंने पैरामीटर को उस संपत्ति को संरक्षित करने के लिए जोड़ा है जो वैकल्पिक लोगों के बाद कम से कम एक गैर-वैकल्पिक तर्क है। ऐसा करना संभव नहीं है, लेकिन यह मुश्किल हो जाता है और सलाह नहीं दी जाती है।

+0

अंतिम अनुच्छेद में, विधि परिभाषा में भी अंतिम() पैरामीटर आवश्यक है? – Pteromys

+1

खैर, यह कभी अनिवार्य नहीं है, लेकिन आपको चेतावनी मिलेगी और इसे पूरी तरह से आग लगाने का कोई तरीका नहीं है (क्योंकि आप इसके लिए "अगले गैर-वैकल्पिक तर्क" को पार नहीं कर सकते हैं), इसलिए यह एक गैर-वैकल्पिक प्रकार 'विकल्प' का पैरामीटर। – gasche