F# F“的含义;类型X=Y/Z“;
Z的X=Y类型在F中是什么意思?特别是,Y代币是否有任何实质性用途?如果我想表达X是一个由底层类型Z支持的类型这一事实,为什么我需要在该表达式中使用Y 根据,使用关键字的F# F“的含义;类型X=Y/Z“;,f#,F#,Z的X=Y类型在F中是什么意思?特别是,Y代币是否有任何实质性用途?如果我想表达X是一个由底层类型Z支持的类型这一事实,为什么我需要在该表达式中使用Y 根据,使用关键字的来表示以下其中一项: 歧视工会 代表 异常类型 严格地说,根据文件,类型X=Y/Z不属于上述三类中的任何一类 它不是有区别的联合语法,因为它缺少管道字符 它不是委托,因为没有Delegate关键字 它不是异常类型,因为该异常类型不存在 因此,似乎Z的类型X=Y是无效的语法,尽管它在语法中被广泛使用。非常令人费解-是文档不准确吗?
来表示以下其中一项:
歧视工会
代表
异常类型
严格地说,根据文件,类型X=Y/Z
不属于上述三类中的任何一类
它不是有区别的联合语法,因为它缺少管道
字符
它不是委托,因为没有Delegate关键字
它不是异常类型,因为该异常类型不存在
因此,似乎Z的类型X=Y
是无效的语法,尽管它在语法中被广泛使用。非常令人费解-是文档不准确吗?与您的直觉相反,这样的声明实际上是一种歧视性的结合——只有一个案例。是的,只有一个案例的歧视联合是完全合法的,有时用于类型安全或隐藏实现细节
如果您不想在那里有额外的Y
,这也是合法的:
type X = Z
这称为“类型别名”。它比有区别的联合的优点是资源消耗(性能和内存),但缺点是它不提供任何额外的安全性,因为X
最终在所有上下文中都与Z
等价和可互换
它不是有区别的联合语法,因为它缺少管道字符
可以省略受歧视的联合中的第一个管道:
类型DU=A/int | B
对于标准的多行定义,这是一种糟糕的样式,但也适用于单行定义。在您的示例中,只有一种情况可以完全省略管道,这无疑会导致混淆。将条形图包括在内将提高清晰度:type X=| Y of Z
在Z的X=Y类型中,Y标记是否有任何重要用途
Y用于消除案例之间的歧义,并用于匹配数据。如果将来可能会有更多的案例,那么使用这种支架进行匹配是有意义的。如果您知道只有一种情况,那么DU就不是最合适的类型,因为记录type X={Y:Z}
是一种更简单的构造,可以达到相同的目的。请记住,如果Z
不是先前定义的类型,那么type X=Z
实际上是一个带有空大小写的单例DU。不是很有用!但是,如果忘记打开系统
,可能会发生意外,例如在类型Duration=TimeSpan
的情况下。