Výsledky

Tento Result<'T,'TFailure> typ umožňuje psát kód odolný proti chybám, který se dá skládat.

Syntaxe

// 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

Poznámky

Result Viz modul pro integrované kombinátory pro Result. typ.

Všimněte si, že typ výsledku je diskriminovaná struktura. Zde platí sémantika strukturální rovnosti.

Tento Result typ se obvykle používá v monadické manipulaci s chybami, což se často označuje jako programování orientované na železnice v rámci komunity jazyka F#. Následující triviální příklad ukazuje tento přístup.

// 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()

Jak vidíte, je poměrně snadné zřetězení různých ověřovacích funkcí, pokud je všechny vynutíte vrátit Result. Díky tomu můžete rozdělit funkce podobné tomuto na malé části, které jsou stejně kompozibilní, jako byste je potřebovali. To má také přidanou hodnotu vynucení použití porovnávání vzorů na konci kola ověření, které pak vynucuje vyšší stupeň správnosti programu.

Viz také