type level =
[ `Debug
| `Info
| `Warning
| `Error]
Tôi có thể xóa "" "tại đây không?Sự khác biệt có hoặc không có backtick "` "là gì?
Trân trọng!
type level =
[ `Debug
| `Info
| `Warning
| `Error]
Tôi có thể xóa "" "tại đây không?Sự khác biệt có hoặc không có backtick "` "là gì?
Trân trọng!
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.
afair, tên được ưa chuộng nhất hiện nay là "các biến thể mở" . – ygrek
Điều này có liên quan (một phần) đến: http://stackoverflow.com/questions/1746743/extending-an-existing-type-in-ocaml/1747400#1747400 –