如何从Discriminated Union案例中为联合案例分配类型?

时间:2016-02-14 13:03:34

标签: f#

如何从Discriminated Union案例中为联合案例分配类型?

代码:

type ValidationResult<'Result> =
    | Success of 'Result
    | Failure of 'Result

type ValidationError =
    | Error1 of Failure
    | Error2 of Failure

错误:

  

未定义“失败”类型

2 个答案:

答案 0 :(得分:7)

你做不到。受歧视的联合案例本身并不是类型 - 将它们视为返回DU类型值的构造函数。因此,在您的情况下,SuccessFailure都是创建ValidationResult<'a>的方法。

因此你需要做这样的事情,这显然没有多大意义:

type ValidationError<'a> =
    | Error1 of ValidationResult<'a>
    | Error2 of ValidationResult<'a>

这可能更接近你想要做的事情:

type ValidationError =
    | Error1
    | Error2

type ValidationResult<'Result> =
    | Success of 'Result
    | Failure of 'Result * ValidationError

答案 1 :(得分:2)

您不能:Failure不是类型。它被编译为一个.NET类,但你不能从F#访问这个类,它只是一个实现细节。

正常的解决方法是创建与案例相对应的实际类型。在你的情况下,它将是

type Failure<'Result> = 'Result

type ValidationResult<'Result> =
    | Success of 'Result
    | Failure of Failure<'Result>

type ValidationError =
    | Error1 of Failure<???>
    | Error2 of Failure<???>