歧视工会可以相互提及吗?

时间:2010-07-22 12:43:35

标签: f# recursion discriminated-union mutual-recursion

我正在使用受歧视的联合构建表达式树。以下代码:

type IntExpression =
    | TrueIsOne of BoolExpression

type BoolExpression =
    | LessThan of IntExpression * IntExpression
    | And of BoolExpression * BoolExpression
    | Or of BoolExpression * BoolExpression
    | Bool of bool

抛出错误,因为未定义BoolExpression。交换定义只会导致反向(未定义IntExpression)。

有解决方法吗?

3 个答案:

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

也许这会奏效:

type IntExpression =
  ...
and BoolExpression = 
  ...

(摘自this page on MSDN。)