定义联合类型时,列出了构造该类型值的所有方法。在最简单的形式,这个定义是这样的:
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