2

以下有区别的联合无法编译:

type Expression =
  | Identifier of string
  | Integer of int
  | Assignment of Identifier * Expression

显示的错误是

The type "Identifier" is not defined.

关于最后一个工会案件。

我已经尝试Expression使用该rec属性进行标记,但这似乎无济于事。

有解决办法吗?更好的是,提到的原因是我麻烦的原因吗?

4

2 回答 2

10

听起来你真的想要

| Assignment of string * Expression

或者

type Id = Id of string
type Expression =
    | Identifier of Id
    | Integer of int
    | Assignment of Id * Expression

如果您想要所有标识符的额外名义类型。

最好尽可能在类型系统中排除无意义的值(无意义的状态不应该是可表示的),这就是为什么如果你的语言不需要它,我会避免Expression在赋值的左侧。

无论如何,不​​允许它的原因是因为Identifier不是类型(Expressionis)。

于 2011-08-26T07:55:50.270 回答
4

你不能这样做。在 Union 内部,您不能引用另一个 Union 元素。

所以应该是:

type Expression =
  | Identifier of string
  | Integer of int
  | Assignment of Expression * Expression

因此,当您解析赋值联合时,您可以在那里验证元组中的第一个表达式应该是标识符。

于 2011-08-26T06:55:59.127 回答