2011-11-22 53 views

Trả lời

9

Thật khó để trả lời câu hỏi này có hoặc không.

Bạn có thể xóa các dấu gạch chéo và dấu ngoặc vuông. Sau đó, bạn sẽ có

type level2 = Debug | Info | Warning | Error 

Trong trường hợp đơn giản nhất, loại này rất giống với loại level của bạn. Nó có 4 hàm tạo liên tục.

Trong các trường hợp phức tạp hơn, các loại khác nhau. Loại của bạn level là loại polymorphic variant, linh hoạt hơn level2 ở trên. Các nhà thầu của level thể xuất hiện trong bất kỳ số lượng các loại khác nhau trong phạm vi tương tự, và level tham gia vào quan hệ subtyping:

# type level = [`Debug | `Info | `Warning | `Error] 
# type levelx = [`Debug | `Info | `Warning | `Error | `Fatal] 

# let isfatal (l: levelx) = l = `Fatal;; 
val isfatal : levelx -> bool = <fun> 
# let (x : level) = `Info;; 
val x : level = `Info 
# isfatal (x :> levelx);; 
- : bool = false 

Mục đích của ví dụ này là mặc dù x có kiểu level, nó có thể được coi là mặc dù nó thuộc loại levelx cũng vậy, vì level là kiểu phụ của levelx.

Không có mối quan hệ phụ giữa các loại biến thể không đa hình như level2 và trên thực tế, bạn không thể sử dụng cùng tên hàm tạo trong nhiều loại như vậy trong cùng phạm vi.

Các loại biến thể đa hình cũng có thể được mở. Đó là một chủ đề lớn; nếu bạn quan tâm, bạn nên xem phần 4.2 của hướng dẫn OCaml, được liên kết ở trên.

+1

afair, tên được ưa chuộng nhất hiện nay là "các biến thể mở" . – ygrek

Các vấn đề liên quan