gpt4 book ai didi

f# - 结果与不同类型绑定(bind)?

转载 作者:行者123 更新时间:2023-12-04 15:42:19 24 4
gpt4 key购买 nike

我制作了一个简单的计算表达式工作流来处理结果。

[<RequireQualifiedAccess>]
module Result =

type Builder() =

member __.Bind(x, f) = x |> Result.bind f

member __.Return(x) = x

member __.ReturnFrom(x) = Ok x

let workflow = Builder()

我还使用不同的类型来表示不同的错误子项:

type ValidationError<'a> = { Obj:'a; Message:string }
type InvalidOperationError = { Operation:string; Message:string }

当两个结果具有不同的错误类型时,就会出现问题。

LetterString.create : string -> Result<LetterString, ValidationError<string>>
Username.create : string -> Result<Username, ValidationError<string>>
PositiveDecimal.create : decimal -> Result<PositiveDecimal, ValidationError<decimal>>
let user = 
Result.workflow {
let! name = LetterString.create "Tom"
let! username = Username.create "Tom01098"
// Error occurs here.
let! balance = PositiveDecimal.create 100m

return! {
// User record creation elided.
}
}
FS0001  Type mismatch. Expecting a
'Result<PositiveDecimal,ValidationError<string>>'
but given a
'Result<PositiveDecimal,ValidationError<decimal>>'

我已经尝试过使用 DU 类型的所有错误:

type Error<'a> =
| ValidationError of Obj:'a * Message:string
| InvalidOperationError of Operation:string * Message:string

当通用参数 'a 在错误之间不同时,这会产生类似的问题。它还在函数的类型签名中丢失了错误的确切类型。

预期的结果是整个工作流有一个统一的错误类型,最好在类型上尽可能具体。

最佳答案

可以通过删除通用参数并使用单个 Error DU 来解决。不幸的是,这失去了我想要的签名,但它必须这样做。

关于f# - 结果与不同类型绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57413824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com