2013-04-08 42 views
9

Tôi đang sử dụng để viết mã như thế này trong C#:Làm thế nào để viết mã này C# trong F #

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

obj.DoSomething(); 

Đây là cách tôi dịch nó trong F # (obj là một danh sách):

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

doSomething obj 

Có cách nào để thực hiện điều này trong F # mà không sử dụng biến có thể thay đổi không? Có cách nào 'thanh lịch' hơn để xử lý tình huống này trong F # không?

Cảm ơn bạn!

Trả lời

20

Chiếc F # -ish Cách thứ nhất là để trả lại cùng một loại biểu hiện trong cả hai ngành:

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

doSomething obj 

Trong F #, bạn có thể xử lý ngoại lệ bằng option loại. Đây là một lợi thế khi không có giá trị mặc định rõ ràng, và trình biên dịch buộc bạn phải xử lý các trường hợp ngoại lệ.

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

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

Tuyệt vời! Tôi biết phải có một cách để làm điều này theo cách F #! Tôi đang học F # và tôi vẫn chưa quen suy nghĩ theo cách chức năng. Cảm ơn bạn! –

8

Wrapping logic này trong các chức năng ...

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

... nó có thể là:

attempt getSomeObj |> orElse getSomeDefaultValue 
+0

Mặc dù tôi đã chọn một số câu trả lời của người dùng khác là hợp lệ Tôi thực sự thích cách 'cố gắng' được viết. Tôi chưa bao giờ nghĩ đến việc viết một cái gì đó như thế. Cảm ơn bạn! –

+0

Bạn được chào đón. Câu trả lời của pad minh họa các mấu chốt của giải pháp: mọi thứ đều là một biểu thức trong F #, nhưng tôi muốn chỉ ra các mẫu liên quan. Các nguyên tắc như thế này có thể hữu ích và đôi khi dẫn đến mã dễ đọc hơn. – Daniel

Các vấn đề liên quan