Domanda

Sto costruendo un albero di espressione usando sindacati discriminati.Il codice qui sotto:

type IntExpression =
    | TrueIsOne of BoolExpression

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

getta un errore perché il boolexpressione non è definito.Scambiare le definizioni Solo risultati nel contrario (l'intexpressione non è definita) come ci si aspetterebbe.

C'è un modo intorno a questo?

È stato utile?

Soluzione

Sì, utilizzare and in Tipo di gruppo Definizioni con inter-dipendenze:

type IntExpression =
    | TrueIsOne of BoolExpression

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

Altri suggerimenti

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

Esempio di non terminazione:

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

Forse questo funzionerà:

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

(Informazioni prese da Questa pagina su msdn .) .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top