作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我用来解释我的问题的最小代码示例。以下代码被组织在两个文件中并且可以正常编译:
数据结构.fs
module MyMod
type XXX = {
a: int
}
with
static member GetNew =
{
a = -1
}
type YYY = {
a: float
}
with
static member GetNew =
{
a = -1.0
}
type Choice =
| XXX of XXX
| YYY of YYY
open MyMod
let generator =
let res = XXX.GetNew
Choice.XXX res
let myVal : XXX =
match generator with
| XXX x -> x
| _ -> printfn "expected XXX, got sth else!"; XXX.GetNew
namespace DataStruct
module MyMod =
type XXX = {
a: int
}
with
static member GetNew =
{
a = -1
}
type YYY = {
a: float
}
with
static member GetNew =
{
a = -1.0
}
type Choice =
| XXX of XXX
| YYY of YYY
open DataStruct
let generator =
let res = MyMod.XXX.GetNew
MyMod.Choice.XXX res
let myVal : MyMod.XXX =
match generator with
| MyMod.XXX x -> x
| _ -> printfn "expected XXX, got sth else!"; MyMod.XXX.GetNew
type Choice =
| TX of XXX
| TY of YYY
open DataStruct
let generator =
let res = MyMod.XXX.GetNew
MyMod.Choice.TX res
let myVal : MyMod.XXX =
match generator with
| MyMod.TX x -> x
| _ -> printfn "expected XXX, got sth else!"; MyMod.XXX.GetNew
最佳答案
您的第一段和第二段代码之间的区别在于您在 Program.fs
中打开模块的方式。 :
open MyMod
,你打开模块open DataStruct
,您只打开命名空间,但还没有打开模块。如果您将其更改为 open DataStruct.MyMod
,您将获得与第一个版本完全相同的行为。 XXX
float ,并且能够根据使用来消除歧义。 XXX
成为最新类型XXX
在 MyMod
中定义.第一个XXX
是你的记录,第二个是从 Choice
派生的类也称为 XXX
.例如,以 ILSpy 之类的方式查看您的程序集。 XXX
成为 DU 类型,隐藏记录类型。有关详细信息,请参阅我的第二个答案。
关于types - F# 如何从其他模块推断类型和标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37968637/
我是一名优秀的程序员,十分优秀!