Khi xác định loại công đoàn, bạn liệt kê tất cả các cách để tạo giá trị của loại đó. Ở dạng đơn giản nhất, định nghĩa đó trông như thế này:
type Visibility
= All
| Active
| Completed
Như bạn đã phỏng đoán, đây tuyên bố kiểu Visibility
và xác định ba giá trị, tất cả các loại Visibility
. Cách duy nhất để xây dựng một giá trị kiểu Visibility
là sử dụng một trong ba tùy chọn này. Do đó, chúng ta thường gọi chúng là "các nhà xây dựng".
Đây là một chút phức tạp hơn định nghĩa kiểu công đoàn:
type TrainStatus
= OnTime
| Delayed Int
Như bạn mong đợi, điều này định nghĩa hai mới "nhà thầu," OnTime
và Delayed
. Nhưng hãy xem các loại của chúng:
OnTime : TrainStatus
Delayed : Int -> TrainStatus
Hàm tạo OnTime
không có đối số và chỉ đơn giản là giá trị; nó đã là TrainStatus
. Nhưng Delayed
được khai báo là một hàm tạo một đối số: đó là hàm tạo mới TrainStatus
trong số Int
. Như vậy, Delayed 5
, Delayed 10
và Delayed 100
đều có giá trị TrainStatus
giá trị. (Chúng tôi có thể giải thích chúng là "bị trì hoãn 5 phút" hoặc tương tự.)
Một hàm tạo có thể thực hiện nhiều đối số; ví dụ: nếu chúng tôi muốn bao gồm, dưới dạng Chuỗi, lý do cho sự chậm trễ:
type TrainStatus
= OnTime
| Delayed Int String
ts : TrainStatus
ts = Delayed 20 "The conductor took a short nap."
xác định Delayed : Int -> String -> TrainStatus
.
Nếu bạn đang đưa ra một TrainStatus
, bạn có thể trích xuất các Int
và String
bên trong của nó sử dụng kết hợp mẫu:
case ts of
OnTime ->
"Your train is on time!"
Delayed minutes reason ->
"Your train has been delayed by " ++ toString minutes ++ " because " ++ reason