Campi immutabili nell'unione discriminata
-
28-10-2019 - |
Domanda
So che è possibile aggiungere metodi e proprietà ai sindacati discriminati, ma puoi aggiungere un campo immutabile che deve essere impostato quando viene creata un'istanza l'unione, proprio come i campi in un record?
Immagino che quello che mi piacerebbe fare sia combinare un tipo di unione e un tipo di record, come questo:
type union =
| OptionOne of int
| OptionTwo of string
{
AFieldUsedForBothCases : string
}
che non è una dichiarazione valida.
So che questo può essere risolto creando un tipo di record:
type record =
{
AFieldUsedForBothCases : string
TheDiscriminatedUnion : union
}
Ma mi piacerebbe fare qualcosa di simile al primo esempio, se possibile.
Soluzione
No, non credo così, ma puoi aggiungerlo a entrambi i casi ed estrarlo con un membro:
type union =
| OptionOne of int * string
| OptionTwo of string * string
member u.AFieldUsedForBothCases =
match u with
| OptionOne (_,s) | OptionTwo(_,s) -> s
Alla fine devi comunque specificare l'elemento aggiuntivo nel tuo costruttore. Ok, questo ti permetterà di rivisitare l'elemento comune su ogni costruttore, ma penso che non sia poi così male.
Altri suggerimenti
Penso che questa sia una soluzione più ordinata
type union=
|a of int
|b of string
type Realtype = string * union
Grazie al controllo del tipo, puoi forzare l'impostazione della proprietà e penso che sia un po 'più ordinato della soluzione record
Non penso che sia possibile. A parte la forma che penso che il tuo secondo codice (usando i record) abbia molto più senso perché DUS riguarda "o questo o quello o quello ...", ora se c'è qualcosa di comune tra tutti quei casi, allora conserverei quella cosa comune fuori dal du piuttosto che all'interno del DU.