2013-04-08 9 views
9

मैं सी # में इस तरह कोड लिखने के लिए इस्तेमाल किया कर रहा हूँ लिखने के लिए कैसे:एफ # में इस सी # कोड

SomeObj obj; 
try{ 
    // this may throw SomeException 
    obj = GetSomeObj(); 
}catch(SomeException){ 
    // Log error... 
    obj = GetSomeDefaultValue(); 
} 

obj.DoSomething(); 

इस तरह से मैं एफ # में यह अनुवाद है (एक सूची जा रहा है obj):

let mutable obj = [] 
try 
    obj <- getSomeObj 
with 
    | ex -> 
     // Log ex 
     obj <- getSomeDefaultValue 

doSomething obj 

क्या एक mutable चर का उपयोग किए बिना F # में ऐसा करने का कोई तरीका है? क्या इस स्थिति को एफ # में संभालने का एक और 'सुरुचिपूर्ण' तरीका है?

धन्यवाद!

उत्तर

20

एफ # -ish तरह से दोनों शाखाओं में से अभिव्यक्ति की एक ही प्रकार के वापस जाने के लिए है:

let obj = 
    try 
     getSomeObj() 
    with 
    | ex -> 
     // Log ex 
     getSomeDefaultValue() 

doSomething obj 

F # में, आप अपवाद option प्रकार से प्रबंधित कर सकते। यह एक लाभ है जब कोई स्पष्ट डिफ़ॉल्ट मान नहीं होता है, और संकलक आपको असाधारण मामलों को संभालने के लिए मजबूर करता है।

let objOpt = 
    try 
     Some(getSomeObj()) 
    with 
    | ex -> 
     // Log ex 
     None 

match objOpt with 
| Some obj -> doSomething obj 
| None -> (* Do something else *) 
+0

वाह! मुझे पता था कि एफ # -शिप तरीके से ऐसा करने का एक तरीका होना चाहिए! मैं एफ # सीख रहा हूं और मुझे अभी भी एक कार्यात्मक तरीके से सोचने के लिए उपयोग नहीं किया गया है। धन्यवाद! –

8

रैपिंग कार्यों में इस तर्क ...

let attempt f = try Some(f()) with _ -> None 
let orElse f = function None -> f() | Some x -> x 

... यह हो सकता है:

attempt getSomeObj |> orElse getSomeDefaultValue 
+0

हालांकि मैंने कुछ अन्य उपयोगकर्ता उत्तर को वैध के रूप में चुना है, मुझे वास्तव में 'प्रयास' लिखा गया तरीका पसंद है। मैंने कभी ऐसा कुछ लिखने के बारे में सोचा नहीं। धन्यवाद! –

+0

आपका स्वागत है। पैड का जवाब समाधान के क्रूक्स को दिखाता है: सब कुछ एफ # में एक अभिव्यक्ति है, लेकिन मैं शामिल पैटर्न को इंगित करना चाहता था। इस तरह के Primitives आसान हो सकता है, और अवसर पर, अधिक पठनीय कोड के लिए नेतृत्व। – Daniel

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