以下歧视联盟无法编译:
type Expression =
| Identifier of string
| Integer of int
| Assignment of Identifier * Expression
显示错误
The type "Identifier" is not defined.
关于最后一个工会案件。
我尝试使用Expression
属性标记rec
,但这似乎无济于事。
有解决办法吗?更好的是,推荐的原因是我遇到麻烦的原因吗?
答案 0 :(得分:10)
听起来你真的想要
| Assignment of string * Expression
或者
type Id = Id of string
type Expression =
| Identifier of Id
| Integer of int
| Assignment of Id * Expression
如果您想为所有标识符添加额外的名义类型。
最好在可能的情况下(meaningless states should not be representable)排除类型系统中无意义的值,这就是为什么如果你的语言没有,我会在作业的左侧避免Expression
需要那个。
在任何情况下,不允许的原因是因为Identifier
不是类型(Expression
是)。
答案 1 :(得分:4)
你做不到。在联盟内部,你不能引用另一个联盟元素。
所以它应该是:
type Expression =
| Identifier of string
| Integer of int
| Assignment of Expression * Expression
因此,当你解析赋值联合时,你可以在那里验证元组中的第一个表达式应该是标识符。