Дизъюнктные объединения могут относиться друг к другу?

Я создаю дерево выражений с помощью дизъюнктных объединений. Ниже кода:

type IntExpression =
    | TrueIsOne of BoolExpression

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

бросает ошибку, потому что BoolExpression не определяется. Свопинг определений просто приводит к реверсу (IntExpression не определяется), как Вы ожидали бы.

Существует ли путь вокруг этого?

14
задан Brian 23 July 2010 в 07:10
поделиться

3 ответа

Да, используйте и для группировки определений типов с взаимозависимостями:

type IntExpression =
    | TrueIsOne of BoolExpression

and BoolExpression =
    | LessThan of IntExpression * IntExpression
    | And of BoolExpression * BoolExpression
    | Or of BoolExpression * BoolExpression
    | Bool of bool
23
ответ дан 1 December 2019 в 07:27
поделиться

"and" обычно работает для типов с взаимозависимостями. То есть он работает для всех типов, таких как размеченные объединения, как показано Mau, классов, записей и взаимно рекурсивных функций.

Непрерывный пример:

let rec foo x = bar x
and bar x = foo x
9
ответ дан 1 December 2019 в 07:27
поделиться

Возможно, это сработает:

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

(Информация взята с этой страницы в MSDN .)

4
ответ дан 1 December 2019 в 07:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: