2010-07-22 18 views
14

Estoy construyendo un árbol de expresiones usando uniones discriminadas. El siguiente código:¿Las uniones discriminadas se refieren entre sí?

type IntExpression = 
    | TrueIsOne of BoolExpression 

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

arroja un error porque BoolExpression no está definido. Al intercambiar las definiciones solo se obtiene el resultado inverso (IntExpression no está definido) como era de esperar.

¿Hay alguna forma de evitar esto?

+0

posible duplicado de [declaraciones # tipo hacia adelante F] (http://stackoverflow.com/questions/1378575/f-forward-type-declarations) – Brian

+0

@ Brian Es el misma pregunta, pero la terminología es lo suficientemente diferente como para no encontrarla ni con Google ni con la búsqueda del sitio. Solo eso podría ser una razón para dejar ambos abiertos. – mavnn

Respuesta

23

Sí, utilice and al grupo de definiciones de tipos con interdependencias:

type IntExpression = 
    | TrueIsOne of BoolExpression 

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

Tal vez esto funcionará:

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

(Información tomada de this page on MSDN.)

9

"y" funciona generalmente para tipos con dependencias mutuas. Es decir, funciona para todos los tipos, como las uniones discriminadas, como se muestra en Mau, las clases, los registros y las funciones mutuamente recursivas.

ejemplo no terminación:

let rec foo x = bar x 
and bar x = foo x 
+1

+1 para el contexto adicional –

Cuestiones relacionadas