Các loại không phải là bộ.
Bạn thấy, lý thuyết tập hợp có một số tính năng đơn giản là không áp dụng cho các loại và ngược lại . Chẳng hạn, một đối tượng có một kiểu chính tắc duy nhất. Nó có thể là một thể hiện của một số loại khác nhau, nhưng chỉ một trong những loại đó được sử dụng để khởi tạo nó. Lý thuyết tập hợp không có khái niệm về tập hợp "chính tắc".
Lý thuyết tập hợp cho phép bạn tạo các tập hợp con một cách nhanh chóng , nếu bạn có một quy tắc mô tả những gì thuộc về tập hợp con. Lý thuyết loại thường không cho phép điều này. Mặc dù hầu hết các ngôn ngữ có một Number
loại hoặc một cái gì đó tương tự, chúng không có một EvenNumber
loại, cũng không đơn giản để tạo ra một loại. Ý tôi là, nó đủ dễ để tự xác định loại, nhưng bất kỳ Number
s nào hiện có thậm chí sẽ không được chuyển đổi một cách kỳ diệu thành EvenNumber
s.
Trên thực tế, việc nói rằng bạn có thể "tạo ra" các tập hợp con có phần không rõ ràng, bởi vì bộ là một loại động vật hoàn toàn khác. Trong lý thuyết tập hợp, những tập hợp con đó đã tồn tại , theo tất cả các cách vô hạn mà bạn có thể định nghĩa chúng. Trong lý thuyết loại, chúng ta thường mong đợi được xử lý một số loại hữu hạn (nếu lớn) tại bất kỳ thời điểm nào. Các loại duy nhất được cho là tồn tại là những loại chúng tôi thực sự đã xác định, không phải mọi loại chúng tôi có thể xác định.
Các bộ không được phép chứa trực tiếp hoặc gián tiếp . Một số ngôn ngữ, chẳng hạn như Python, cung cấp các loại có cấu trúc ít thông thường hơn (trong Python, type
loại chính tắc là type
và object
được coi là một thể hiện của object
). Mặt khác, hầu hết các ngôn ngữ không cho phép các loại do người dùng xác định tham gia vào loại mánh khóe này.
Các bộ thường được phép chồng lên nhau mà không được chứa trong nhau. Điều này không phổ biến trong lý thuyết loại, mặc dù một số ngôn ngữ hỗ trợ nó dưới dạng đa thừa kế. Các ngôn ngữ khác, chẳng hạn như Java, chỉ cho phép một hình thức hạn chế này hoặc không cho phép hoàn toàn.
Loại trống tồn tại (nó được gọi là loại dưới cùng ), nhưng hầu hết các ngôn ngữ không hỗ trợ nó, hoặc không coi nó là loại hạng nhất. "Loại chứa tất cả các loại khác" cũng tồn tại (nó được gọi là loại hàng đầu ) và được hỗ trợ rộng rãi, không giống như lý thuyết tập hợp.
Lưu ý : Như một số nhà bình luận trước đây đã chỉ ra (trước khi chủ đề được chuyển sang trò chuyện), có thể mô hình hóa các loại với lý thuyết tập hợp và các cấu trúc toán học tiêu chuẩn khác. Chẳng hạn, bạn có thể mô hình thành viên kiểu như một mối quan hệ thay vì mô hình hóa thành các tập hợp. Nhưng trong thực tế, điều này đơn giản hơn nhiều nếu bạn sử dụng lý thuyết thể loại thay vì lý thuyết tập hợp. Đây là cách Haskell mô hình lý thuyết loại của nó, ví dụ.
Khái niệm "phân nhóm" thực sự khá khác biệt với khái niệm "tập hợp con". Nếu X
là một kiểu con của Y
nó, điều đó có nghĩa là chúng ta có thể thay thế các thể hiện của Y
các trường hợp X
và chương trình vẫn sẽ "hoạt động" theo một nghĩa nào đó. Đây là hành vi chứ không phải cấu trúc, mặc dù một số ngôn ngữ (ví dụ: Go, Rust, được cho là C) đã chọn ngôn ngữ sau vì lý do thuận tiện, cho người lập trình hoặc thực hiện ngôn ngữ.
a
vàb
là thành viên của loại đó, như Killian Forth đề cập. Lớp học của tôi là đẳng cấu với các bản ghi với các trườnga
vàb
loạiint
vàdouble
- bạn có thể lấy một bản ghi như thế và biến nó thành một ví dụ củamyclass
.