可以在区分联合中相互引用吗?

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 未被定义),这是可以预料的。

有没有什么解决方法?


可能是F#前向类型声明的重复问题。 - Brian
@Brian 这是同一个问题,但术语不同,以至于我无法在Google或网站搜索中找到它。这本身可能就足以让两者都保持开放状态。 - mavnn
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

9

"and" 通常适用于具有相互依赖的类型。这意味着它适用于所有类型,例如 Mau 显示的辨别联合、类、记录和相互递归的函数。

非终止示例:

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

4
也许这个方法会奏效:
type IntExpression =
  ...
and BoolExpression = 
  ...

(Information taken from this page on MSDN.)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接