2009-03-08 18 views
7

में कैसे काम करता है तो मैं एप्रेस द्वारा विशेषज्ञ एफ # पुस्तक पढ़ रहा हूं, ज्यादातर खिलौने-आईएसएच एफ # लाइब्रेरी का निर्माण करते समय इसे संदर्भ के रूप में उपयोग कर रहा हूं, लेकिन एक बात है जिसे मैं समझने में विफल रहा हूं और वह "विकल्प" प्रकार है।विकल्प प्रकार एफ #

यह कैसे काम करता है और यह वास्तविक दुनिया का उपयोग क्या है?

उत्तर

19

विकल्प प्रकार कम से कम समान सी # में Nullable<T> और संदर्भ प्रकार है। Option<T> का मान None है जिसका अर्थ है कि T के किसी विशेष मान के साथ कोई encapsuated मान नहीं है, या Some है। यह अभी जिस तरह सी # में एक Nullable<int>या तो शून्य मान, या एक संबद्ध int है की तरह है - और जिस तरह सी # में एक String मूल्य है या तो एक अशक्त संदर्भ, या स्ट्रिंग ऑब्जेक्ट को संदर्भित करता है ।

आप एक विकल्प मूल्य का उपयोग करते हैं, तो आप आम तौर पर दो रास्ते निर्दिष्ट - मामले के लिए एक जहां है एक संबद्ध मूल्य, और एक जहां नहीं है। दूसरे शब्दों में, इस कोड:

let stringLength (str:Option<string>) = 
    match str with 
    | Some(v) -> v.Length 
    | None -> -1 

समान है:

int StringLength(string str) 
{ 
    if (str != null) 
    { 
     return str.Length; 
    } 
    else 
    { 
     return -1; 
    } 
} 

मेरा मानना ​​है कि सामान्य विचार है कि मजबूर कर आप (अच्छी तरह से, लगभग) "कोई जुड़े मूल्य/वस्तु को संभालने के लिए है "मामला आपके कोड को और मजबूत बनाता है।

2

जब आप मान वैकल्पिक होते हैं तो आप इसका उपयोग करते हैं। एक प्रयोग है कि एक प्रकार का 'शून्य संदर्भ' होना चाहिए, उदा।

val x : int option ref = None 

फिर आप बाद में कुछ v को एक्स अपडेट कर सकते हैं। आप इसे मैच स्टेटमेंट के साथ उपयोग करते हैं, उदा।

match !x with (* dereference x *) 
    None -> (* No value, do something *) 
| Some v -> (* Value v, do something else *) 
4

इसका उपयोग तब किया जाता है जब कोई फ़ंक्शन या विधि "शायद" या "वैकल्पिक रूप से" मान वापस करनी चाहिए। सी # में आप संभवतया शून्य वापस आ जाएंगे, या Null Object या संभवतः मूल्य प्रकारों के लिए एक Nullable वापस आना होगा।

लौटने वाले शून्य (सबसे आम मामला) का नकारात्मक पक्ष यह है कि यह सुरक्षित प्रकार नहीं है: शून्य सभी प्रकारों का एक उदाहरण है, इसलिए आप बाद में सभी प्रकार की बालों वाली नल संदर्भ स्थितियों में आते हैं।

विकल्प प्रकार दो रचनाकारों के साथ एक तथाकथित डिस्मिनेटेड यूनियन प्रकार है: कोई नहीं और कुछ ए। कोई भी स्पष्ट रूप से इंगित करता है कि आपके पास कोई मूल्य नहीं है। असल में यह सामान्य ऑब्जेक्ट पैटर्न सामान्यीकृत है।

1

अन्य उत्तरों को जोड़ने के लिए, विकल्प प्रकार कुछ खास नहीं है - यह सिर्फ एक और भेदभाव संघ है।आप इसे एक पंक्ति में अपने आप को परिभाषित कर सकते हैं:,

type 'a Option = None | Some of 'a 

उपयोगिता के रूप में अन्य लोगों ने बताया है, कि पैटर्न मिलान आप सुरक्षित रूप से बजाय अशक्त के लिए जाँच या यदि इंगित करने के लिए कुछ हैक-समाधान का उपयोग करने का यह deconstruct, दूँगी है एक मूल्य वास्तव में एक मूल्य नहीं है।

0

एक कार्यात्मक पैटर्न विकल्प प्रकार का उपयोग:

जब आप इस तरह के एक पेड़ या एक सूची के रूप में एक पुनरावर्ती डेटा संरचना के कुछ हिस्सों, बदलने की जरूरत है, आप के रूप में मौजूदा डेटा संरचना के रूप में ज्यादा पुन: उपयोग करना चाहते हैं मुमकिन। विकल्प प्रकार इसमें सहायता कर सकते हैं। इन दोनों कार्यों दोनों 7, साथ नंबर 5 की सभी घटनाओं की जगह लेकिन पहले एक प्रतियां पूरे पेड़। दूसरा नहीं है।

type Tree = Leaf of int 
     | Node of Tree * Tree 

let rec replace_no_sharing tree = 
    match tree with 
    | Leaf 5  -> Leaf 7 
    | Leaf x  -> Leaf x 
    | Node (a, b) -> Node (replace_no_sharing a, replace_no_sharing b) 

let replace_with_sharing tree = 
    let rec replace_option tree = 
     match tree with 
     | Leaf 5  -> Leaf 7 |> Some 
     | Leaf x  -> None 
     | Node (a, b) -> match replace_option a, replace_option b with 
         | None, None  -> None 
         | Some a, Some b -> Node (a, b) |> Some 
         | Some a, None -> Node (a, b) |> Some 
         | None, Some b -> Node (a, b) |> Some 
    match replace_option tree with 
    | None  -> tree 
    | Some tree -> tree 

यह सभी मामलों में आवश्यक नहीं हो सकता है, लेकिन यह जानना एक अच्छी तकनीक है।

संबंधित मुद्दे