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

How to assign a specific type to a discriminated union type in F#

假设我有以下类型:

type TypeA = { A: string }
type TypeB = { B: string }

我有一个联合类型:

type MyUnionType = TypeA | TypeB

用一个类型来包含联合类型:

type MyContainer = { Union: MyUnionType }

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

let resultA = { A = "abc" }

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

let result = { Union = resultA }

编译器抱怨说

Compilation error (line 10, col 24): This expression was expected to have type MyUnionType but here has type TypeA

但是TypeA联合指定的有效类型之一!我怎样才能将它分配给我的联盟 属性?

程序示例如下:https://dotnetfiddle.net/fgJKpM

type MyUnionType = TypeA | TypeB中,TypeATypeB不引用前面的TypeATypeB记录,而是[=的空构造函数17=] 类型。如果您希望它们包含这些类型的值,您需要将它们包含在定义中,例如

type MyUnionType = TypeA of TypeA | TypeB of TypeB

您可能希望重命名构造函数以避免它们与包含的类型混淆。

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

let resultA = TypeA { A = "abc" }