Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
türü Result<'T,'TFailure> , oluşturulabilen hataya dayanıklı kod yazmanızı sağlar.
Sözdizimi
// 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
Açıklamalar
Result için yerleşik birleştiriciler modülüne Resultbakın. tür.
Sonuç türünün, ayrımcı bir yapı birleşimi olduğuna dikkat edin. Yapısal eşitlik semantiği burada geçerlidir.
Türü Result genellikle F# topluluğu içinde Demiryolu odaklı Programlama olarak adlandırılan monadik hata işlemede kullanılır. Aşağıdaki önemsiz örnekte bu yaklaşım gösterilmektedir.
// 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()
Gördüğünüz gibi, tümünü döndürmeye Resultzorlarsanız çeşitli doğrulama işlevlerini birbirine zincirleme oldukça kolaydır. Bu, bu gibi işlevleri ihtiyaç duyduğunuz kadar birleştirilebilir olan küçük parçalara ayırmanıza olanak tanır. Bu ayrıca, doğrulama turunun sonunda desen eşleştirme kullanımını zorunlu kılmanın ek değerine sahiptir ve bu da daha yüksek bir program doğruluğu derecesini zorlar.