[英]How to write this C# code in F#
我習慣在C#中編寫這樣的代碼:
SomeObj obj;
try{
// this may throw SomeException
obj = GetSomeObj();
}catch(SomeException){
// Log error...
obj = GetSomeDefaultValue();
}
obj.DoSomething();
這是我在F#中翻譯它的方式(obj是一個列表):
let mutable obj = []
try
obj <- getSomeObj
with
| ex ->
// Log ex
obj <- getSomeDefaultValue
doSomething obj
有沒有辦法在不使用可變變量的情況下在F#中執行此操作? 是否有一種更“優雅”的方式來處理F#中的這種情況?
謝謝!
F#-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 *)
在函數中包含這個邏輯......
let attempt f = try Some(f()) with _ -> None
let orElse f = function None -> f() | Some x -> x
...它可能是:
attempt getSomeObj |> orElse getSomeDefaultValue
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.