2012-04-12 25 views
6

我試圖讓我的頭圍繞歧視工會和記錄類型;特別是如何組合它們以獲得最大的可讀性。這裏有一個例子 - 比如說一個運動隊可以有積分(聯賽積分和淨勝球),或者可以暫停聯盟,在這種情況下,它沒有積分或者淨勝球。我試圖表達如下:結合歧視工會與記錄類型

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 } 

問題出現在最後一行的末尾,我說'狀態=點'。我得到'表達預期有類型的TeamState,但這裏有類型的點'。我該如何解決這個問題?

回答

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

您的美麗!謝謝你。 – Kit 2012-04-12 16:08:36

+0

(允許時將標記爲答案 - 6分鐘!) – Kit 2012-04-12 16:09:00

15

一些細節加墊的答案,爲什麼你的最初版本沒有工作是分配給State值的類型應該是TeamState類型的區分聯合值。在你的表達:

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

...的points類型是Points。在pad發佈的版本中,表達式CurrentPoints points使用TeamState的構造函數創建代表CurrentPoints的區分聯合值。另一種選擇是,工會給你是Suspended,它可以這樣使用:

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

如果你沒有使用構造函數的名稱,那麼它是不明確的,你會如何構建一個暫停的團隊!

最後,你也可以寫上只有一行的一切,但是這不是爲可讀:

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

感謝您的闡述Tomas :-) – Kit 2012-04-12 16:17:09