F# F“的含义;类型X=Y/Z“;

F# F“的含义;类型X=Y/Z“;,f#,F#,Z的X=Y类型在F中是什么意思?特别是,Y代币是否有任何实质性用途?如果我想表达X是一个由底层类型Z支持的类型这一事实,为什么我需要在该表达式中使用Y 根据,使用关键字的来表示以下其中一项: 歧视工会 代表 异常类型 严格地说,根据文件,类型X=Y/Z不属于上述三类中的任何一类 它不是有区别的联合语法,因为它缺少管道字符 它不是委托,因为没有Delegate关键字 它不是异常类型,因为该异常类型不存在 因此,似乎Z的类型X=Y是无效的语法,尽管它在语法中被广泛使用。非常令人费解-是文档不准确吗?

Z的X=Y类型在F中是什么意思?特别是,Y代币是否有任何实质性用途?如果我想表达X是一个由底层类型Z支持的类型这一事实,为什么我需要在该表达式中使用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
    的情况下。