Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Mit dem Result<'T,'TFailure> Typ können Sie fehlertoleranten Code schreiben, der zusammengesetzt werden kann.
Syntax
// The definition of Result in FSharp.Core
[<StructuralEquality; StructuralComparison>]
[<CompiledName("FSharpResult`2")>]
[<Struct>]
type Result<'T,'TError> =
| Ok of ResultValue:'T
| Error of ErrorValue:'TError
Bemerkungen
Lesen Sie das Result Modul für die integrierten Kombinatoren für die Result. Art.
Beachten Sie, dass der Ergebnistyp eine strukturdiskriminierte Vereinigung ist. Hier gelten strukturelle Gleichheitsemantik.
Der Result Typ wird in der Regel bei der monadischen Fehlerbehandlung verwendet, die häufig als eisenbahnorientierte Programmierung innerhalb der F#-Community bezeichnet wird. Im folgenden trivialen Beispiel wird dieser Ansatz veranschaulicht.
// Define a simple type which has fields that can be validated
type Request =
{ Name: string
Email: string }
// Define some logic for what defines a valid name.
//
// Generates a Result which is an Ok if the name validates;
// otherwise, it generates a Result which is an Error.
let validateName req =
match req.Name with
| null -> Error "No name found."
| "" -> Error "Name is empty."
| "bananas" -> Error "Bananas is not a name."
| _ -> Ok req
// Similarly, define some email validation logic.
let validateEmail req =
match req.Email with
| null -> Error "No email found."
| "" -> Error "Email is empty."
| s when s.EndsWith("bananas.com") -> Error "No email from bananas.com is allowed."
| _ -> Ok req
let validateRequest reqResult =
reqResult
|> Result.bind validateName
|> Result.bind validateEmail
let test() =
// Now, create a Request and pattern match on the result.
let req1 = { Name = "Phillip"; Email = "phillip@contoso.biz" }
let res1 = validateRequest (Ok req1)
match res1 with
| Ok req -> printfn $"My request was valid! Name: {req.Name} Email {req.Email}"
| Error e -> printfn $"Error: {e}"
// Prints: "My request was valid! Name: Phillip Email: phillip@consoto.biz"
let req2 = { Name = "Phillip"; Email = "phillip@bananas.com" }
let res2 = validateRequest (Ok req2)
match res2 with
| Ok req -> printfn $"My request was valid! Name: {req.Name} Email {req.Email}"
| Error e -> printfn $"Error: {e}"
// Prints: "Error: No email from bananas.com is allowed."
test()
Wie Sie sehen können, ist es ganz einfach, verschiedene Überprüfungsfunktionen zusammenzuketten, wenn Sie erzwingen, dass sie alle zurückzugeben Result. Auf diese Weise können Sie Funktionen wie diese in kleine Teile aufteilen, die so komponierbar sind, wie Sie sie benötigen. Dies hat auch den Mehrwert, die Verwendung des Musterabgleichs am Ende einer Überprüfungsrunde zu erzwingen, was wiederum einen höheren Grad an Programmkorrektur erzwingt.