我是一名新手F#程序员,如果我的问题很愚蠢或者语法有点问题,请提前谅解。希望可以理解我的问题的要点。
我想实现的是能够组合不同错误类型(区分联合)的
让我举个例子。
假设我有一个定义如下的类型
假设您有一个验证名称的函数:
现在我想组合
在像ReasonML这样的语言中,您可以使用称为多态变体的东西,但据我所知,F#中不可用。
是否有可能使用联合类型的泛型(或任何其他技术)来模拟多态变体?!还是这是不可能的?
我想实现的是能够组合不同错误类型(区分联合)的
Result
(或Either
或类似的东西),而不需要创建一个显式的包含两个其他区分联合的联合区分联合。让我举个例子。
假设我有一个定义如下的类型
Person
:type Person =
{ Name: string
Email: string }
假设您有一个验证名称的函数:
type NameValidationError =
| NameTooLong
| NameTooShort
let validateName person : Result<Person, NameValidationError>
还有一个验证电子邮件地址的功能:
type EmailValidationError =
| EmailTooLong
| EmailTooShort
let validateEmail person : Result<Person, EmailValidationError>
现在我想组合
validateName
和validateEmail
,但问题在于Result
中的错误类型不同。我想实现的是一个函数(或运算符),使我能够像这样做某事:let validatedPerson = person |> validateName |>>> validateEmail
(|>>>
是"魔法操作符")
通过使用|>>>
,validatedPerson
的错误类型将成为NameValidationError
和EmailValidationError
的联合:
Result<Person, NameValidationError | EmailValidationError>
为了明确起见,在组合链中使用任意数量的函数应该是可能的,即:
let validatedPerson : Result<Person, NameValidationError | EmailValidationError | XValidationError | YValidationError> =
person |> validateName |>>> validateEmail |>>> validateX |>>> validateY
在像ReasonML这样的语言中,您可以使用称为多态变体的东西,但据我所知,F#中不可用。
是否有可能使用联合类型的泛型(或任何其他技术)来模拟多态变体?!还是这是不可能的?