.net 修复具有区分并集的立即循环引用

.net 修复具有区分并集的立即循环引用,.net,f#,functional-programming,circular-reference,discriminated-union,.net,F#,Functional Programming,Circular Reference,Discriminated Union,我正在制作一个小型Pascal解析器,支持声明无限类型: 程序::=程序标识符;街区 块::=变量声明部分过程声明部分语句部分 过程声明部分::={procedure declaration;} 过程声明::=过程标识符;挡块 我尝试为此语法创建AST域类型: type Program = Identifier * Block and Block = VariableDeclaration list option * ProcedureDeclaration list option * Stat

我正在制作一个小型Pascal解析器,支持声明无限类型:

程序::=程序标识符;街区

块::=变量声明部分过程声明部分语句部分

过程声明部分::={procedure declaration;}

过程声明::=过程标识符;挡块

我尝试为此语法创建AST域类型:

type Program = Identifier * Block
and Block = VariableDeclaration list option * ProcedureDeclaration list option * Statement list
and ProcedureDeclaration = Identifier * Block
但是编译器会抛出一个错误,因为我使用类型别名,并且它们在编译时被擦除:

此类型定义涉及通过缩写的直接循环引用

有人说我可以用包装的歧视联合类型解决这个问题,我该怎么办

and ProcedureDeclaration = ProcedureDeclaration of Identifier * Block
现在,它不是一个元组,而是一个单一的case DU类型,您可以使用

ProcedureDeclaration(someID, someBlock)
分解

match somePD with
| ProcedureDeclaration(i,b) -> ...