14

我正在使用可区分的联合构建表达式树。下面的代码:

type IntExpression =
    | TrueIsOne of BoolExpression

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

抛出错误,因为 BoolExpression 未定义。正如您所期望的那样,交换定义只会导致相反的结果(未定义 IntExpression)。

有没有解决的办法?

4

3 回答 3

23

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

type IntExpression =
    | TrueIsOne of BoolExpression

and BoolExpression =
    | LessThan of IntExpression * IntExpression
    | And of BoolExpression * BoolExpression
    | Or of BoolExpression * BoolExpression
    | Bool of bool
于 2010-07-22T12:47:03.150 回答
9

“and”通常适用于具有相互依赖关系的类型。也就是说,它适用于所有类型,例如区分联合(如 Mau 所示)、类、记录和相互递归函数。

非终止示例:

let rec foo x = bar x
and bar x = foo x
于 2010-07-22T13:35:28.073 回答
4

也许这会起作用:

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

(信息取自MSDN 上的此页面。)

于 2010-07-22T12:46:44.487 回答