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