2012-04-12 7 views
6

Ich versuche, diskriminierten Gewerkschaften und Datensatztypen meinen Kopf zu bekommen; speziell, wie sie für maximale Lesbarkeit kombiniert werden. Hier ein Beispiel: Eine Sportmannschaft kann entweder Punkte (sowohl Liga- als auch Tordifferenz) haben, oder sie kann aus der Liga ausgeschlossen werden. In diesem Fall hat sie keine Punkte oder Tordifferenz. Hier ist, wie ich versuchte, das auszudrücken:Kombinieren von diskriminierten Gewerkschaften mit Datensatztypen

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 } 

Das Problem kommt am Ende der letzten Zeile, wo ich ‚State = Punkte‘ sagen. Ich bekomme 'Ausdruck wurde erwartet, dass TeamState eingegeben wurde, aber hier sind Punkte eingegeben'. Wie komme ich da rum?

Antwort

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

Sie Schönheit! Danke Pad. – Kit

+0

(Wird als Antwort markiert, wenn erlaubt - 6 Minuten!) – Kit

15

um einige Details zu Pad Antwort, den Grund, warum Ihre erste Version arbeitete hinzufügen nicht, dass die Art von Wert zu State zugewiesen TeamState ein diskriminierten Vereinigung Wert vom Typ sein sollte. In Ihrem Ausdruck:

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

... die Art der points ist Points. In der von pad geposteten Version verwendet der Ausdruck CurrentPoints points einen Konstruktor TeamState, um einen diskriminierten Vereinigungswert zu erstellen, der CurrentPoints darstellt. Die andere Option, die die Vereinigung gibt Ihnen ist Suspended, die wie folgt verwendet werden kann:

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

Wenn Sie nicht den Namen des Konstrukteurs verwendet haben, dann ist es nicht klar, wie man eine Bewährungs Team bauen würde!

Schließlich können Sie auch alles auf nur eine einzige Zeile schreiben, aber das ist nicht so lesbar:

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

Danke für die Ausarbeitung Tomas :-) – Kit

Verwandte Themen