【问题标题】:Use of the and keyword in F# in discriminated unions在 F# 中在可区分联合中使用 and 关键字
【发布时间】:2011-11-01 12:52:20
【问题描述】:

我今天遇到了以下 DU 声明:

type Grammar = Definition list

and  Definition = Def of string * Expression

and  Range =
     | Char  of char
     | Range of char * char

为什么要在这里使用关键字and 而不是type

【问题讨论】:

    标签: .net f# functional-programming discriminated-union


    【解决方案1】:

    GrammarDefinition 的定义需要 and 才能正确编译。 Grammar 类型首先列出,但取决于稍后定义的 Definition 类型。为了正确编译,它必须与 and 链接,它告诉 F# 编译器类型定义是依赖/相关的。

    Range 没有理由以这种方式声明,应使用 type 声明

    【讨论】:

    • 另外,Grammar 可以放在 Definition 的声明之后,然后它们就没有理由在其中任何一个上使用 and
    【解决方案2】:

    用于创建相互关联的类型。通常在 F# 中,您需要在使用每个类型之前对其进行前向声明 - 但这并不总是可行的,例如当您需要引入对两个或多个类型的循环依赖时。

    在您的示例中,如果您使用type 而不是and 定义Definition,您将无法编译Grammar 的定义,除非您切换它们的定义顺序。

    您发布的代码示例并不完全是一个好的示例,因为其中不需要相互关系 - 您可以更改顺序。 (除非根据上述情况进一步定义了更多类型)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-19
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      相关资源
      最近更新 更多