我正在使用受歧视的联合构建表达式树。以下代码:
type IntExpression =
| TrueIsOne of BoolExpression
type BoolExpression =
| LessThan of IntExpression * IntExpression
| And of BoolExpression * BoolExpression
| Or of BoolExpression * BoolExpression
| Bool of bool
抛出错误,因为未定义BoolExpression。交换定义只会导致反向(未定义IntExpression)。
有解决方法吗?
答案 0 :(得分:23)
是的,使用and
对具有相互依赖关系的类型定义进行分组:
type IntExpression =
| TrueIsOne of BoolExpression
and BoolExpression =
| LessThan of IntExpression * IntExpression
| And of BoolExpression * BoolExpression
| Or of BoolExpression * BoolExpression
| Bool of bool
答案 1 :(得分:9)
“和”通常适用于具有相互依赖关系的类型。也就是说,它适用于所有类型,例如有区别的联合,如Mau所示,类,记录和相互递归函数。
非终止示例:
let rec foo x = bar x
and bar x = foo x
答案 2 :(得分:4)