Могут ли дискриминационные союзы ссылаться друг на друга?
Я строю дерево выражений, используя различимые союзы. Код ниже:
type IntExpression =
| TrueIsOne of BoolExpression
type BoolExpression =
| LessThan of IntExpression * IntExpression
| And of BoolExpression * BoolExpression
| Or of BoolExpression * BoolExpression
| Bool of bool
выдает ошибку, потому что BoolExpression не определено. Замена определений просто приводит к обратному (IntExpression не определено), как и следовало ожидать.
Это можно обойти?
3 ответа
Решение
Да использовать 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.)