定義聯合類型時,列出了構造該類型值的所有方法。在最簡單的形式,這個定義是這樣的:
type Visibility
= All
| Active
| Completed
正如您所推測,這種聲明的類型Visibility
並定義了三個值,所有Visibility
類型。構建Visibility
類型值的唯一方法是使用這三個選項之一。因此,我們經常稱他們爲「構造者」。
這裏有一個稍微更復雜的聯合類型定義:
type TrainStatus
= OnTime
| Delayed Int
正如你所期望的,這定義了兩個新的「構造」 OnTime
和Delayed
。但看看他們的類型:
OnTime : TrainStatus
Delayed : Int -> TrainStatus
構造函數OnTime
零參數,所以只是一個值;它已經是TrainStatus
。但Delayed
被聲明爲單參數構造函數:它是一個函數,它從Int
中創建一個新的TrainStatus
。因此,Delayed 5
,Delayed 10
和Delayed 100
都是有效的TrainStatus
值。 (我們可以將它們解釋爲「延遲5分鐘」或類似的東西。)
構造函數可以帶多個參數;舉例來說,如果我們想包括,作爲一個字符串,延遲的原因是:
type TrainStatus
= OnTime
| Delayed Int String
ts : TrainStatus
ts = Delayed 20 "The conductor took a short nap."
定義Delayed : Int -> String -> TrainStatus
。
如果你給一個TrainStatus
,您可以使用模式匹配提取其內部的Int
和String
:
case ts of
OnTime ->
"Your train is on time!"
Delayed minutes reason ->
"Your train has been delayed by " ++ toString minutes ++ " because " ++ reason