Pregunta

Estoy construyendo un árbol de expresión usando sindicatos discriminados.El siguiente código:

type IntExpression =
    | TrueIsOne of BoolExpression

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

lanza un error porque la boolexpression no está definida.Intercambiar las definiciones simplemente resulta en el reverso (no se define la intoxresión) como lo esperaba.

¿Hay alguna manera de evitar esto?

¿Fue útil?

Solución

Sí, use and a definiciones de tipo de grupo con las dependencias entre:

type IntExpression =
    | TrueIsOne of BoolExpression

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

Otros consejos

"y" funciona generalmente para tipos con dependencias mutuas.Es decir, funciona para todos los tipos, como los sindicatos discriminados, como lo demuestra Mau, clases, registros y funciones mutuamente recursivas.

Ejemplo no terminado:

let rec foo x = bar x
and bar x = foo x

Tal vez esto funcionará:

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

(información tomada de esta página en MSDN .)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top