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

mav*_*vnn 14 recursion f# mutual-recursion discriminated-union

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

type IntExpression =
    | TrueIsOne of BoolExpression

type BoolExpression =
    | LessThan of IntExpression * IntExpression
    | And of BoolExpression * BoolExpression
    | Or of BoolExpression * BoolExpression
    | Bool of bool
Run Code Online (Sandbox Code Playgroud)

抛出错误,因为未定义BoolExpression.交换定义只会导致反向(IntExpression未定义),如您所料.

有没有解决的办法?

Mau*_*Mau 23

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

type IntExpression =
    | TrueIsOne of BoolExpression

and BoolExpression =
    | LessThan of IntExpression * IntExpression
    | And of BoolExpression * BoolExpression
    | Or of BoolExpression * BoolExpression
    | Bool of bool
Run Code Online (Sandbox Code Playgroud)


Joh*_*lds 9

"和"通常适用于具有相互依赖关系的类型.也就是说,它适用于所有类型,例如被区分的联合,如Mau所示,类,记录和相互递归的函数.

非终止示例:

let rec foo x = bar x
and bar x = foo x
Run Code Online (Sandbox Code Playgroud)