2013-04-08 11 views
9

Ich bin es gewohnt, Code wie folgt in C# zu schreiben:Wie diese C# -Code in F # schreiben

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

obj.DoSomething(); 

Dies ist die Art, wie ich es in F # übersetzt (obj eine Liste ist):

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

doSomething obj 

Gibt es eine Möglichkeit, dies in F # ohne eine veränderbare Variable zu tun? Gibt es einen eleganteren Weg, um mit dieser Situation in F # umzugehen?

Vielen Dank!

Antwort

20

Die F # -ish Art und Weise ist die gleiche Art von Ausdruck in beiden Zweigen zurückzukehren:

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

doSomething obj 

In F #, Sie Ausnahmen mit option Art verarbeiten können. Dies ist ein Vorteil, wenn es keinen offensichtlichen Standardwert gibt und der Compiler Sie zwingt, Ausnahmefälle zu behandeln.

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

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

Great! Ich wusste, dass es einen Weg geben muss, dies auf eine FIS-Weise zu tun! Ich lerne F # und habe mich immer noch nicht daran gewöhnt, funktional zu denken. Vielen Dank! –

8

Wrapping diese Logik in Funktionen ...

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

... es könnte sein:

attempt getSomeObj |> orElse getSomeDefaultValue 
+0

Obwohl ich eine andere Benutzerantwort als gültig gewählt habe, mag ich die Art, wie "Versuch" geschrieben wurde. Ich hätte nie darüber nachgedacht, so etwas zu schreiben. Vielen Dank! –

+0

Gern geschehen. pads Antwort zeigt den Kern der Lösung: Alles ist ein Ausdruck in F #, aber ich wollte auf die beteiligten Muster hinweisen. Primitive wie diese können nützlich sein und gelegentlich zu besser lesbarem Code führen. – Daniel