次の方法で共有


結果

Result<'T,'TFailure>型を使用すると、構成可能なエラー トレラント コードを記述できます。

構文

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

注釈

Resultの組み込みコンバイネータについては、Result モジュールを参照してください。 種類。

結果の型は 構造体判別共用体であることに注意してください。 ここでは、構造等価セマンティクスが適用されます。

Result型は、通常、モナディック エラー処理で使用されます。これは、F# コミュニティ内で鉄道指向プログラミングと呼ばれることがよくあります。 次の簡単な例は、この方法を示しています。

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

ご覧のように、 Resultを返すように強制すると、さまざまな検証関数を連結するのは非常に簡単です。 これにより、このような機能を、必要に応じて構成可能な小さな部分に分割できます。 これには、検証のラウンドの最後にパターン マッチングの使用を強制する付加価値もあります。これにより、プログラムの正確性が高くなります。

こちらも参照ください