Question

Je suis en train de construire une arborescence d'expression à l'aide de victimes de syndicats.Le code ci-dessous:

type IntExpression =
    | TrueIsOne of BoolExpression

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

renvoie une erreur car BoolExpression n'est pas défini.La permutation des définitions seulement les résultats dans le sens inverse (IntExpression n'est pas défini) comme vous le souhaitez.

Est-il un moyen de contourner cela?

Était-ce utile?

La solution

Oui, l'utilisation and pour le groupe des définitions de type 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

Autres conseils

"et" fonctionne généralement pour des types avec des dépendances mutuelles.C'est-à-dire que cela fonctionne pour tous les types, tels que des syndicats discriminés, comme indiqué par Mau, des classes, des enregistrements et des fonctions mutuellement récursives.

Exemple non terminant:

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

Peut-être que cela fonctionnera:

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

(informations extraites de Cette page sur MSDN .)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top