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.

Était-ce utile?

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.

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