Могут ли дискриминационные союзы ссылаться друг на друга? - PullRequest
14 голосов
/ 22 июля 2010

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

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 ]

23 голосов
/ 22 июля 2010

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

type IntExpression =
    | TrueIsOne of BoolExpression

and BoolExpression =
    | LessThan of IntExpression * IntExpression
    | And of BoolExpression * BoolExpression
    | Or of BoolExpression * BoolExpression
    | Bool of bool
9 голосов
/ 22 июля 2010

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

Пример без завершения:

let rec foo x = bar x
and bar x = foo x
4 голосов
/ 22 июля 2010

Возможно, это будет работать:

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

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

...