Một số thời gian trước đây trong một trong các tiện ích mở rộng Haskell (không thể tìm thấy liên kết) và recently in Ur Tôi đã tìm thấy tên (ví dụ: trường bản ghi) tạo thành một Loại. Ai đó có thể giải thích tại sao Loại trừu tượng là không đủ cho họ?Tại sao các tên tạo thành một loại và không chỉ là một loại?
Trả lời
Câu trả lời rất đơn giản: vì chúng có thể xuất hiện trong các loại. Do đó, họ phải sống ở cấp độ loại (nếu không bạn sẽ cần các loại phụ thuộc). Và bởi vì chúng sống ở cấp độ loại, chúng được phân loại theo một loại.
Hệ thống ghi xác định quy tắc cho các giá trị, loại và (có thể) các loại. Những quy tắc nào được sử dụng phụ thuộc vào hệ thống kiểu được thiết kế và những gì nhà thiết kế mong muốn đạt được.
Ví dụ: trong Haskell, hãng thu âm là:
- giá trị (các chức năng accessor)
- những giá trị đó có các loại (ví dụ
Record -> Int
) - những loại có loại (
*
)
hệ thống kỷ lục khác có thể sử dụng hệ thống loại hoặc loại cho các mục đích khác nhau.
Bằng cách đặt nhãn theo loại riêng biệt, trình kiểm tra loại có thể xử lý chúng đặc biệt, với các quy tắc đặc biệt cho ví dụ: ống kính tự động, hoặc bằng chứng để làm với xây dựng hồ sơ (tổng số có lẽ) không đúng với chức năng mục đích chung.
Ví dụ về việc sử dụng hệ thống loại trong Haskell là sử dụng "loại không được hộp". Đây là những loại có:
- đại diện thời gian chạy khác nhau để các giá trị thường xuyên
- hình thức ràng buộc khác nhau (ví dụ như không thể được cấp phát trên heap)
Để giữ cho các loại không có hộp bọc từ pha trộn với bình thường các loại, chúng được cung cấp loại khác nhau, cho phép trình biên dịch theo dõi sự phân tách của chúng. Vì vậy, không có gì kỳ diệu về tên nhãn bản ghi có nghĩa là bạn phải sử dụng một loại khác để đại diện cho chúng - đó chỉ là sự lựa chọn mà một nhà thiết kế ngôn ngữ có thể thực hiện - và bằng ngôn ngữ được đánh máy phụ thuộc như Ur hoặc Twelf, đó có thể là một sự phân biệt hữu ích.
Cảm ơn, ví dụ về các loại không được mở là khai sáng – Fixpoint
- 1. Tại sao System.Enum không phải là một loại giá trị?
- 2. Truyền tới loại không xác định Khi chỉ cho tên lớp là một chuỗi loại đó
- 3. 'uint32_t' không tên một loại
- 4. _int64 không tên một loại
- 5. Loại có thể là loại tham chiếu và loại giá trị cùng một lúc không?
- 6. Tại sao các loại giá trị không thể là rỗng
- 7. Tại sao VC++ C4150 (xóa con trỏ thành loại không đầy đủ) chỉ là cảnh báo?
- 8. "không tên một loại" lỗi
- 9. Tại sao "loại lớp" được gọi là "loại lớp"?
- 10. Tại sao các loại tham chiếu không được khởi tạo thành null?
- 11. Tại sao không có loại hàm một phần nào?
- 12. Tại sao loại chung loại này không được chuyển đổi?
- 13. C++ lỗi: 'unordered_map' không tên một loại
- 14. Lỗi: '...' không đặt tên là loại
- 15. vì vậy loại "này" là gì? Tại sao "này" không phải là một lvalue?
- 16. Tại sao không phải là lớp Loại trong không gian tên System.Reflection?
- 17. Tại sao không phải là loại ràng buộc một phần của chữ ký phương pháp?
- 18. lợi nhuận tại sao typeid rằng int và const int là cùng một loại
- 19. Cách chỉ định Không gian tên cho một loại được tạo thông qua Reflection.Emit?
- 20. C++ tự động không tên một loại
- 21. Lỗi "xxxx" không tên một loại
- 22. Không thể tạo một lớp tạm thời (kết quả = 1). lỗi CS0030: Không thể chuyển đổi loại 'Loại []' thành 'Loại'?
- 23. Tại sao tôi không thể tạo một cá thể với loại không được tham số này?
- 24. Tại sao tiêu chuẩn lớp std :: pair thay đổi để không cho phép các loại chỉ với một hàm tạo bản sao không cố định trong C++ 11?
- 25. Làm thế nào để tải một loại từ tên của loại và tên của hội đồng
- 26. Tại sao enums được coi là loại hợp chất?
- 27. Tên loại hoặc không gian tên 'Linq' không tồn tại
- 28. Tại sao tôi không thể tạo một vectơ lambdas (cùng loại) trong C++ 11?
- 29. Tại sao một chữ bát phân không phải là một chuỗi ký tự thành một số?
- 30. Tại sao các loại chuỗi và vector khác biệt?
Câu trả lời này đã đặt mọi thứ vào vị trí trong đầu của tôi. Cảm ơn! – Fixpoint