2012-09-18 31 views
21

Các loại xóa Haskell, và nếu có, theo cách nào thì điều này tương tự/không giống với loại tẩy xoá xảy ra trong Java?Có loại xóa haskell không?

+4

Tôi không tin rằng Java có loại xóa thích hợp: http://gergo.erdi.hu/blog/2011-12-03-how_i_learned_about_java's_lack_of_type_erasure_the_hard_way/ – Cactus

+0

Đồng ý - bài viết này về Xác minh Bytecode cho Haskell của Robert Dockins và Samuel Z. Guyer của Đại học Tufts cũng có một số hiểu biết về loại tẩy xóa khi thực hiện một trình biên dịch Haskell. http://www.cs.princeton.edu/~rdockins/pubs/TR-2007-2.pdf – Bittercoder

+3

Loại xóa trong Java bị hạn chế đối với generics, cho phép kiểm tra thời gian chạy các loại nhưng không phải là đối số kiểu chung. Nó đã được thực hiện theo cách này để đảm bảo khả năng tương thích ngược. – scarfridge

Trả lời

35

Cảnh báo: trải nghiệm + suy luận. Tham khảo ý kiến ​​một người làm việc trên cả hai trình biên dịch cho The Truth.

Theo nghĩa là kiểm tra kiểu được thực hiện tại thời gian biên dịch và một số tính năng phức tạp của hệ thống kiểu được giảm xuống nhiều cấu trúc ngôn ngữ đơn giản hơn, nhưng theo một cách khá khác với Java.

Chữ ký loại không tạo chi phí thời gian chạy. Trình biên dịch Haskell rất tốt trong việc chuyển đổi chương trình (nó có nhiều thời gian hơn, bởi vì thứ tự chạy trong nhiều trường hợp không được chỉ định bởi người lập trình), và tự động định nghĩa các định nghĩa thích hợp và các hàm haskell-polymorhpic (= java-generic) cho một kiểu cụ thể vv, vì nó thấy phù hợp, nếu nó giúp. Đó là một cách tương tự như xóa bỏ loại Java, nhưng nhiều khía cạnh hơn.

Có bản chất không có loại phôi cần thiết trong Haskell để đảm bảo an toàn loại, bởi vì Haskell được thiết kế loại an toàn từ mặt đất lên. Chúng tôi không sử dụng để biến mọi thứ thành đối tượng và chúng tôi không truyền lại chúng, bởi vì chức năng đa hình (chung) thực sự hoạt động trên bất kỳ loại dữ liệu nào, bất kể loại con trỏ hay số nguyên không có hộp, chỉ hoạt động, không cần sự cố. Vì vậy, không giống như Java, việc đúc không phải là một tính năng của việc biên dịch mã đa hình (chung). Haskell dân gian có xu hướng cảm thấy rằng nếu bạn đang làm kiểu đúc, bạn nói lời tạm biệt để loại an toàn anyway.

Để có một ví dụ đáng yêu về cách đảm bảo tính chính xác kiểu tĩnh của mã tại thời gian biên dịch có thể tránh được thời gian chạy, có cấu trúc newtype trong Haskell, một trình bao bọc an toàn loại cho loại hiện có và được biên dịch hoàn toàn - tất cả việc xây dựng và tiêu hủy chỉ đơn giản là không xảy ra trong thời gian chạy. Hệ thống kiểu đảm bảo tại thời gian biên dịch nó được sử dụng đúng, nó không thể có được tại thời gian chạy ngoại trừ các chức năng truy cập (loại được kiểm tra).

Chức năng đa hình (chung) không có chi phí đa hình. Các hàm quá tải Haskell (các phương thức giao diện Java) có một phí dữ liệu theo nghĩa là có một từ điển ngầm của các hàm được sử dụng cho những gì dường như bị ràng buộc trễ với các lập trình viên Java, nhưng thực tế lại được xác định tại thời gian biên dịch.

Tóm tắt: có, thậm chí nhiều hơn so với trong Java, và không, chúng chưa bao giờ có thời gian chạy để xóa.

+3

Cảm ơn Andrew, bản tóm tắt ở cuối đặt bóng đèn tắt cho tôi .. giải thích tuyệt vời – Bittercoder

1

C và Pascal có loại xóa. Java cho phép bạn kiểm tra các lớp tại thời gian chạy - thậm chí các lớp được nạp động!

Haskell nào gần gũi hơn với Pascal so với Java.

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