繁体   English   中英

在F#允许的歧视联盟中相互引用的案例?

[英]Mutually referring cases in Discriminated Unions allowed in F#?

以下歧视联盟未能编译:

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

显示的错误是

The type "Identifier" is not defined.

关于最后一个工会案件。

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

有解决办法吗? 更好的是,引用我的麻烦的原因是什么?

听起来你真的想要

| Assignment of string * Expression

或者

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

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

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

在任何情况下,不允许它的原因是因为Identifier不是一个类型( Expression is)。

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

所以它应该是:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM