19

I was faced today with the following DUs declarations:

type Grammar = Definition list

and  Definition = Def of string * Expression

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

Why would one use the keyword and instead of type, here?

4

2 回答 2

26

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

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

于 2011-08-22T22:42:29.780 回答
16

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

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

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

于 2011-08-22T22:44:50.260 回答