如何在F#中将特定类型分配给已区分的联合类型

Jam*_*lls 1 f# discriminated-union

假设我有以下几种类型:

type TypeA = { A: string }
type TypeB = { B: string }
Run Code Online (Sandbox Code Playgroud)

我对他们两个都有联合体类型:

type MyUnionType = TypeA | TypeB
Run Code Online (Sandbox Code Playgroud)

使用仅包含联合类型的类型:

type MyContainer = { Union: MyUnionType }
Run Code Online (Sandbox Code Playgroud)

现在,如果我创建联合类型中一种类型的实例:

let resultA = { A = "abc" }
Run Code Online (Sandbox Code Playgroud)

当我尝试将该实例分配给容器中的值时

let result = { Union = resultA }
Run Code Online (Sandbox Code Playgroud)

编译器抱怨说

编译错误(第10行,第24行):该表达式的类型为MyUnionType,但此处的类型为TypeA

但是TypeA 联合中指定的有效类型之一!如何将其分配给我的Union财产?

这是该程序的示例:https : //dotnetfiddle.net/fgJKpM

Lee*_*Lee 6

在中type MyUnionType = TypeA | TypeBTypeA并且TypeB不引用前面的TypeATypeB记录,但是是该MyUnionType类型的null构造函数。如果希望它们包含这些类型的值,则需要将它们包括在定义中,例如

type MyUnionType = TypeA of TypeA | TypeB of TypeB
Run Code Online (Sandbox Code Playgroud)

您可能想要重命名构造函数,以避免它们与所包含的类型之间的混淆。

然后,您需要向构造函数提供相应的实例:

let resultA = TypeA { A = "abc" }
Run Code Online (Sandbox Code Playgroud)