2010-07-22 4 views
14

Je construis un arbre d'expression en utilisant des unions discriminées. Le code ci-dessous:Les syndicats discriminés peuvent-ils se référer les uns aux autres?

type IntExpression = 
    | TrueIsOne of BoolExpression 

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

génère une erreur car BoolExpression n'est pas défini. L'échange des définitions aboutit à l'inverse (IntExpression n'est pas défini) comme vous pouvez vous y attendre.

Y a-t-il un moyen de contourner cela?

+0

double possible (http://stackoverflow.com/questions/1378575/f-forward-type-declarations) – Brian

+0

[F # @ Brian déclarations de type avant] Il est le même question, mais la terminologie est assez différente que je n'ai pas réussi à trouver avec Google ou la recherche du site. Cela seul pourrait être une raison de laisser les deux ouverts. – mavnn

Répondre

23

Oui, utiliser and aux définitions de type groupe avec inter-dépendances:

type IntExpression = 
    | TrueIsOne of BoolExpression 

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

Peut-être que ceci fonctionne:

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

(Informations prises de this page on MSDN.)

9

"et" fonctionne généralement pour les types avec des dépendances mutuelles. C'est-à-dire qu'il fonctionne pour tous les types, tels que les unions discriminées, comme le montre Mau, les classes, les enregistrements et les fonctions mutuellement récursives.

non terminaison exemple:

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

+1 pour le contexte supplémentaire –

Questions connexes