F# 受歧视的工会可以相互参照吗?

F# 受歧视的工会可以相互参照吗?,f#,recursion,discriminated-union,mutual-recursion,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

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

type IntExpression =
    | TrueIsOne of BoolExpression

type BoolExpression =
    | LessThan of IntExpression * IntExpression
    | And of BoolExpression * BoolExpression
    | Or of BoolExpression * BoolExpression
    | Bool of bool
由于未定义BoolExpression,因此引发错误。交换定义只会产生与预期相反的结果(未定义IntExpression)


有办法解决这个问题吗?

也许这会奏效:

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

(信息取自。)

是,使用
对具有相互依赖关系的类型定义进行分组:

type IntExpression =
    | TrueIsOne of BoolExpression

and BoolExpression =
    | LessThan of IntExpression * IntExpression
    | And of BoolExpression * BoolExpression
    | Or of BoolExpression * BoolExpression
    | Bool of bool
“和”通常适用于相互依赖的类型。也就是说,它适用于所有类型,如Mau、类、记录和相互递归函数所示的有区别的联合

非终止示例:

let rec foo x = bar x
and bar x = foo x

@Brian的可能重复是同一个问题,但术语差异太大,以至于我无法通过谷歌或网站搜索找到它。光是这一点就可能是让这两个领域保持开放的理由。