F# 类型构造函数的别名是否可以与类型的别名相同?
考虑以下几点:F# 类型构造函数的别名是否可以与类型的别名相同?,f#,F#,考虑以下几点: module Module1 = type Foo = Bar | Baz type Lorem = {Ipsum: int} module Module2 = type Foo = Module1.Foo type Lorem = Module1.Lorem let foo = Bar // Error: The value or constructor 'Bar' is not defined let lorem = {Ipsum = 2}
module Module1 =
type Foo = Bar | Baz
type Lorem = {Ipsum: int}
module Module2 =
type Foo = Module1.Foo
type Lorem = Module1.Lorem
let foo = Bar // Error: The value or constructor 'Bar' is not defined
let lorem = {Ipsum = 2} // Error: The record label 'Ipsum' is not defined
是否可以以简单的方式对类型进行别名,并且仍然能够实际构造它们,而无需打开Module1
背景:我正在创建一个应用程序和相应的web API。他们将通过序列化和反序列化POCO(POFOs?)相互交谈,POFOs的定义在应用程序和web API引用的项目中的模块(对应于
Module1
)中可用。API和类型是版本化的,因此我希望在应用程序和web API中有一个types
模块(对应于Module2
),我只需将API类型的最新版本别名(例如type Foo=Shared.V2.Foo
),然后在应用程序和API中使用这些别名,因为这意味着我不需要在整个app/API中引用特定的版本。(如果这是一个糟糕的想法,请告诉我。)您的类型别名在现有代码中完全没有使用。如果您通过以下方式限定这些标识符来显式使用它们,则此操作有效:
let foo = Foo.Bar
let lorem = {Lorem.Ipsum = 2}
我明白了,谢谢。它的用法似乎与通常定义类型并用
RequireQualifiedAccess
修饰的用法类似。这是正确的吗?有没有办法不用在任何地方对它们进行鉴定就可以使用它们呢?我不会说这就像使用RequireQualifiedAccess
。在Module1
中,Foo
是一个类型,Bar
是由类型声明隐式创建的值。在Module2
中,Bar
根本不存在。无法将其连接到Module2.Foo
类型别名。