2012-04-12 14 views
6

Sto cercando di capire come creare unioni e tipi di record discriminati; in particolare come combinarli per la massima leggibilità. Ecco un esempio: diciamo che una squadra sportiva può avere punti (sia punti di lega che differenza reti), oppure può essere sospesa dal campionato nel qual caso non ha punti o differenza reti. Ecco come ho cercato di esprimere che:Unione di unioni discriminate con tipi di record

type Points = { LeaguePoints : int; GoalDifference : int } 

type TeamState = 
    | CurrentPoints of Points 
    | Suspended 

type Team = { Name : string; State : TeamState } 

let points = { LeaguePoints = 20; GoalDifference = 3 } 

let portsmouth = { Name = "Portsmouth"; State = points } 

Il problema arriva alla fine dell'ultima riga, dove dico 'state = punti'. Ricevo che "Expression avrebbe dovuto essere di tipo TeamState ma qui ha tipo Points". Come faccio ad aggirarlo?

risposta

5
let portsmouth = { Name = "Portsmouth"; State = CurrentPoints points } 
+0

È bellezza! Grazie pad. – Kit

+0

(segnerà come risposta se consentito - 6 minuti!) – Kit

15

Per aggiungere alcuni dettagli alla risposta di pad, il motivo per cui la versione iniziale non ha funzionato è che il tipo di valore assegnato a State dovrebbe essere un valore un'unione discriminata di tipo TeamState. Nella tua espressione:

let portsmouth = { Name = "Portsmouth"; State = points } 

... il tipo di points è Points. Nella versione pubblicata da pad, l'espressione CurrentPoints points utilizza un costruttore di TeamState per creare un valore unione discriminato che rappresenta CurrentPoints. L'altra opzione che l'Unione dà è Suspended, che può essere utilizzato in questo modo:

let portsmouth = { Name = "Portsmouth"; State = CurrentPoints points } 
let portsmouth = { Name = "Portsmouth"; State = Suspended } 

Se non hai usato il nome del costruttore, allora non è chiaro come ci si costruisce una squadra sospesa!

Infine, è possibile anche scrivere tutto solo su una singola linea, ma non è leggibile:

let portsmouth = 
    { Name = "Portsmouth" 
    State = CurrentPoints { LeaguePoints = 20; GoalDifference = 3 } } 
+1

Grazie per l'elaborazione Tomas :-) – Kit

Problemi correlati