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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top