Peut discrimination syndicats se référer les uns aux autres?
-
27-09-2020 - |
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?
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 .)