champs en union discriminée Immuable
-
28-10-2019 - |
Question
Je sais qu'il est possible d'ajouter des méthodes et des propriétés aux syndicats discriminés, mais pouvez-vous ajouter un champ immuable qui doit être réglé lorsqu'une instance du syndicat est créé, un peu comme les champs dans un enregistrement?
Je suppose que ce que je voudrais faire est de combiner un type d'union et un type d'enregistrement, comme ceci:
type union =
| OptionOne of int
| OptionTwo of string
{
AFieldUsedForBothCases : string
}
qui n'est pas une déclaration valide.
Je sais que cela peut être résolu en créant un type d'enregistrement:
type record =
{
AFieldUsedForBothCases : string
TheDiscriminatedUnion : union
}
mais je voudrais faire quelque chose de similaire au premier exemple, si possible.
La solution
Non, je ne pense pas, mais vous pouvez l'ajouter aux deux cas et l'extraire avec un membre:
type union =
| OptionOne of int * string
| OptionTwo of string * string
member u.AFieldUsedForBothCases =
match u with
| OptionOne (_,s) | OptionTwo(_,s) -> s
En fin de compte, vous devez spécifier l'élément supplémentaire dans votre constructeur de toute façon. Ok, celui-ci vous permettra de l'élément commun retapez sur chaque constructeur mais je pense que ce n'est pas si mal que ça.
Autres conseils
Je pense que c'est une solution plus propre
type union=
|a of int
|b of string
type Realtype = string * union
Merci à la vérification de type, vous pouvez forcer le paramètre de propriété, et je pense qu'il est un peu plus propre que la solution d'enregistrement
Je ne pense pas que cela soit possible. Outre la forme que je pense que votre deuxième code (en utilisant des données) est beaucoup plus logique parce DDVP est de « ceci ou cela ou cela ... », maintenant s'il y a quelque chose de commun entre tous ces cas, alors je garde cette chose commune de l'UA plutôt que l'intérieur du dU.