Я создаю дерево выражений с помощью дизъюнктных объединений. Ниже кода:
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 =
| TrueIsOne of BoolExpression
and BoolExpression =
| LessThan of IntExpression * IntExpression
| And of BoolExpression * BoolExpression
| Or of BoolExpression * BoolExpression
| Bool of bool
"and" обычно работает для типов с взаимозависимостями. То есть он работает для всех типов, таких как размеченные объединения, как показано Mau, классов, записей и взаимно рекурсивных функций.
Непрерывный пример:
let rec foo x = bar x
and bar x = foo x
Возможно, это сработает:
type IntExpression =
...
and BoolExpression =
...
(Информация взята с этой страницы в MSDN .)