2012-09-05 32 views
10

मैं OCaml के लिए नया हूँ, मैं समझने के लिए आपको एक 'एक विकल्प से लाभ प्राप्त करने की अपेक्षा की कोशिश कर रहा हूँ रहे हैं। http://ocaml-lib.sourceforge.net/doc/Option.html पर दस्तावेज़ के अनुसार, 'a option ->' प्रकार का एक कार्य मिलता है जो मैं चाहता हूं। लेकिन जब मैं टाइप करता हूं:OCaml विकल्प मिल

# let z = Some 3;; 
val z : int option = Some 3 
# get z;; 
Error: Unbound value get 
# Option.get z;; 
Error: Unbound module Option 

यह काम क्यों नहीं कर रहा है?

+3

आप ओकैम के लिए एक वैकल्पिक उपयोगिता लाइब्रेरी ओकम्ल-लिब के लिए प्रलेखन को देख रहे हैं। निश्चित रूप से आपको 'कुछ' कन्स्ट्रक्टर के अंदर मूल्य तक पहुंचने के लिए उस लाइब्रेरी की आवश्यकता नहीं है। –

उत्तर

14

OCaml में निर्माता के किसी भी प्रकार के अंदर मूल्य प्राप्त करने के लिए परंपरागत तरीके पैटर्न मिलान के साथ है। पैटर्न मिलान OCaml कि क्या आप पहले से ही अन्य भाषाओं में देखा है से सबसे अलग हो सकता है का हिस्सा है, तो मैं सुझाव है कि आप सिर्फ कार्यक्रमों जिस तरह से आप (उदाहरण के साथ समस्या यह है circumventing के लिए ocaml-lib करने के लिए उपयोग किया जाता है नहीं लिखते) लेकिन इसके बजाय इसे आजमाएं और देखें कि आपको यह पसंद है या नहीं।

let contents = 
    match z with 
    Some c -> c;; 

चर contents3 असाइन किया गया है, लेकिन आपको यह चेतावनी मिलती:

चेतावनी 8: इस पैटर्न मिलान संपूर्ण नहीं है। यहाँ एक मूल्य है कि मिलान नहीं किया है, इसके उदाहरण है: कोई नहीं

सामान्य स्थिति में, आपको पता नहीं होगा कि अभिव्यक्ति आप अंदर देखने के लिए चाहते हैं जरूरी Some c है। विकल्प विकल्प का चयन करने का कारण आमतौर पर होता है कि कभी-कभी वह मान None हो सकता है। यहां संकलक आपको याद दिला रहा है कि आप संभावित मामलों में से एक को संभालने में कामयाब नहीं हैं।

आप पैटर्न मैचों के लिए "गहन" कर सकते हैं और संकलक अभी भी exhaustivity के लिए जाँच करेगा।

let f x = 
    match x with 
    Some (Some c) -> c 
    | None -> 0 
    ;; 

आप मामले Some (None) भूल गया और संकलक आप ऐसा कहता है यहाँ:

चेतावनी 8: इस पैटर्न मिलान संपूर्ण नहीं है इस समारोह है कि एक (int option) option लेता है पर विचार करें। यहां एक मान का है जो मेल नहीं खाता है: कुछ कोई नहीं

+4

यह उल्लेख है कि अपने पहले उदाहरण 'जाने ग में' –

+0

कुछ c = z इस जवाब में मैं पैटर्न मिलान के लिए विशेष रूप 'मैच with' उपयोग कर रहा हूँ क्योंकि बाद हाथ में विषय है और मैं इसे नहीं लगता कि के बराबर है लायक है इसे पहले एक ही निर्माण में जोड़ने के लिए दर्द होता है। –

+0

मैं आपसे सहमत हूँ जिसके कारण मैं एक टिप्पणी के रूप में इस factoid कहा,;) –

9

ऐसा करने का सामान्य तरीका पैटर्न मिलान के साथ है।

# let x = Some 4;; 
val x : int option = Some 4 

# match x with 
    | None -> Printf.printf "saw nothing at all\n" 
    | Some v -> Printf.printf "saw %d\n" v;; 
saw 4 
- : unit =() 

(हालांकि आप तय करने के लिए क्या आप जब मूल्य कोई नहीं है क्या करना चाहते हैं) आप अपनी खुद की get समारोह लिख सकते हैं।

+0

एक अच्छा जवाब है कि।उस उदाहरण पर विस्तार करने के लिए, चलिए x को स्ट्रिंग रखें और प्रिंट करें: https://gist.github.com/shehaaz/7165109 तो संभावित रूप से आप एक सामान्य फ़ंक्शन लिख सकते हैं जो सभी प्रकारों को संभालता है। – Shehaaz

4

आपको उपरोक्त पोस्टर सलाह को प्रकार की सुरक्षा के बारे में सुनना चाहिए, लेकिन यह भी पता होना चाहिए कि विकल्प.get (जो बैटरी बीटीडब्ल्यू में उपलब्ध है) असुरक्षित कार्य आमतौर पर एक्सएन के साथ पर्याप्त होता है। यदि आप उत्सुक हैं तो यह विकल्प है कि Option.get या Option.get_exn को कार्यान्वित किया जा सकता है:

let get_exn = function 
    | Some x -> x 
    | None -> raise (Invalid_argument "Option.get")