在受歧视的联盟中使用F#中的and关键字

dev*_*ium 16 .net f# functional-programming discriminated-union

我今天面临以下DUs声明:

type Grammar = Definition list

and  Definition = Def of string * Expression

and  Range =
     | Char  of char
     | Range of char * char
Run Code Online (Sandbox Code Playgroud)

为什么人们会使用关键字and而不是type

Jar*_*Par 24

and是需要的定义GrammarDefinition正确编译.的Grammar类型显示第一,但取决于类型Definition稍后定义.为了正确编译,它必须与andF#编译器链接,告诉F#编译器类型定义是依赖/相关的.

没有理由Range以这种方式宣布并且应该宣布type

  • 此外,`Grammar`可以在'Definition`声明之后放置,然后他们没有理由在任何一个上使用`和`. (18认同)

Mar*_*k H 15

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

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

您发布的代码示例并不是一个好的代码示例,因为相关关系不是必需的 - 您可以更改顺序.(除非有更多的类型进一步定义,这取决于上述情况).