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

时间:2019-10-06 13:27:09

标签: f# discriminated-union

假设我具有以下类型:

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

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

type MyUnionType = TypeA | TypeB

仅包含联合类型的类型:

type MyContainer = { Union: MyUnionType }

现在是否创建联合类型中一种类型的实例:

let resultA = { A = "abc" }

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

let result = { Union = resultA }

编译器抱怨

  

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

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

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

1 个答案:

答案 0 :(得分:6)

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

MyUnionType

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

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

type MyUnionType = TypeA of TypeA | TypeB of TypeB