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

时间:2011-08-26 06:43:01

标签: .net f# functional-programming discriminated-union

以下歧视联盟无法编译:

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

显示错误

The type "Identifier" is not defined.

关于最后一个工会案件。

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

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

2 个答案:

答案 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

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