如何在 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
是联合指定的有效类型之一!我怎样才能将它分配给我的联盟 属性?
在type MyUnionType = TypeA | TypeB
中,TypeA
和TypeB
不引用前面的TypeA
和TypeB
记录,而是[=的空构造函数17=] 类型。如果您希望它们包含这些类型的值,您需要将它们包含在定义中,例如
type MyUnionType = TypeA of TypeA | TypeB of TypeB
您可能希望重命名构造函数以避免它们与包含的类型混淆。
然后您需要向构造函数提供相应的实例:
let resultA = TypeA { A = "abc" }
假设我有以下类型:
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
是联合指定的有效类型之一!我怎样才能将它分配给我的联盟 属性?
在type MyUnionType = TypeA | TypeB
中,TypeA
和TypeB
不引用前面的TypeA
和TypeB
记录,而是[=的空构造函数17=] 类型。如果您希望它们包含这些类型的值,您需要将它们包含在定义中,例如
type MyUnionType = TypeA of TypeA | TypeB of TypeB
您可能希望重命名构造函数以避免它们与包含的类型混淆。
然后您需要向构造函数提供相应的实例:
let resultA = TypeA { A = "abc" }