【问题标题】:Can discriminated unions refer to each other?受歧视的工会可以相互引用吗?
【发布时间】:2011-03-19 13:05:41
【问题描述】:

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

type IntExpression =
    | TrueIsOne of BoolExpression

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

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

有没有办法解决这个问题?

【问题讨论】:

  • @Brian 这是同一个问题,但术语不同,我无法通过谷歌或网站搜索找到它。仅此一项可能就是让两者都打开的原因。

标签: f# recursion discriminated-union mutual-recursion


【解决方案1】:

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

type IntExpression =
    | TrueIsOne of BoolExpression

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

【讨论】:

    【解决方案2】:

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

    非终止示例:

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

    【讨论】:

      【解决方案3】:

      也许这会起作用:

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

      (信息取自this page on MSDN。)

      【讨论】:

        猜你喜欢
        • 2011-11-17
        • 1970-01-01
        • 2017-06-08
        • 1970-01-01
        • 2023-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多