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

Я строю дерево выражений, используя различимые союзы. Код ниже:

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.)

Другие вопросы по тегам