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

type IntExpression =
    | TrueIsOne of BoolExpression

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

抛出错误,因为未定义boolexpression。交换定义只是结果在反向(未定义的intlexpression),因为您希望。

有办法围绕这个吗?

有帮助吗?

解决方案

是,使用and与依赖关系的组类型定义:

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
.

也许这将有效:

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

(从在msdn 上这个页面)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top