Могут ли дискриминированные союзы относятся друг к другу?

StackOverflow https://stackoverflow.com/questions/3308928

Вопрос

Я строю дерево выражения с использованием различных профсоюзов.Ниже приведен код:

type IntExpression =
    | TrueIsOne of BoolExpression

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

бросает ошибку, потому что буолекс не определена.Обмен определениям только приводит к обратному (Intexpression не определено), как вы ожидаете.

Есть ли путь вокруг этого?

Это было полезно?

Решение

Да, используйте 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 ./ P >.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top