2010-07-22 14 views
14

Sto costruendo un albero di espressioni usando le unioni discriminate. Il seguente codice:Le unioni discriminate possono riferirsi a vicenda?

type IntExpression = 
    | TrueIsOne of BoolExpression 

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

genera un errore perché BoolExpression non è definito. Scambiando le definizioni si ottengono solo risultati inversi (IntExpression non è definita) come ci si aspetterebbe.

C'è un modo per aggirare questo?

+0

possibile duplicato del [dichiarazioni # tipo in avanti F] (http://stackoverflow.com/questions/1378575/f-forward-type-declarations) – Brian

+0

@ Brian E 'il stessa domanda, ma la terminologia è abbastanza diversa da non riuscire a trovarla con Google o con la ricerca del sito. Solo questo potrebbe essere un motivo per lasciare entrambi aperti. – mavnn

risposta

23

Sì, usa and al gruppo definizioni del tipo con interdipendenze:

type IntExpression = 
    | TrueIsOne of BoolExpression 

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

Forse questo funzionerà:

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

(Informazioni tratte da this page on MSDN.)

9

"e" funziona generalmente per i tipi con dipendenze reciproche. Cioè, funziona per tutti i tipi, come le unioni discriminate, come mostrato da Mau, classi, record e funzioni reciprocamente ricorsive.

non esempio di terminazione:

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

+1 per il contesto extra –

Problemi correlati