2013-04-08 40 views
9

F # Bu C# kodu yazmak için:C# böyle kod yazmak için alışkınım

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

doSomething obj 
: (bir liste olmaktan obj)

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

obj.DoSomething(); 

Bu benim F # tercüme yoludur bir değişken değişken kullanmadan F # bunu yapmanın bir yolu

var mı? Bu durumu F # ile halletmenin daha 'zarif' bir yolu var mı?

Teşekkür ederiz!

cevap

20

F # -ish yolu her iki branşta ifade aynı tür döndürmektir:

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

doSomething obj 

F #, sen option türünü kullanarak istisnaları işleyebilir. Bu, açık bir varsayılan değer olmadığında bir avantajdır ve derleyici, olağandışı durumları ele almanız için sizi zorlar.

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

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

Büyük! Bunu F # -tuş şeklinde yapmanın bir yolu olduğunu biliyordum! Buna F # öğreniyorum ve hala işlevsel bir şekilde düşünmeye alıştım değil. Teşekkür ederim! –

8

Paketleme fonksiyonlarda bu mantık ...

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

... bu olabilir:

attempt getSomeObj |> orElse getSomeDefaultValue 
+0

Başka bir kullanıcı cevabını geçerli olarak seçtiğim halde, gerçekten “girişimin” yazıldığı yolu seviyorum. Böyle bir şey yazmayı hiç düşünmemiştim. Teşekkür ederiz! –

+0

Rica ederim. pad'in cevabı çözümün acımasızlığını gösterir: her şey F # 'de bir ifadedir, fakat ben de ilgili kalıpları belirtmek istedim. Bunlar gibi temel ilkeler kullanışlı olabilir ve zaman zaman daha okunabilir kodlara yol açabilir. – Daniel

İlgili konular