Tôi đã chọn cung cấp các loại lớp quá tải thông thường và nhiều loại trong ngôn ngữ của mình.
Tôi coi (mở) quá tải là điều cần thiết, đặc biệt là trong một ngôn ngữ có rất nhiều kiểu số (Felix có tất cả các kiểu số C). Tuy nhiên, không giống như C ++ lạm dụng quá tải bằng cách tạo các mẫu phụ thuộc vào nó, tính đa hình của Felix là tham số: bạn cần nạp chồng cho các mẫu trong C ++ vì các mẫu trong C ++ được thiết kế xấu.
Các loại lớp cũng được cung cấp trong Felix. Đối với những người biết C ++ nhưng không tìm hiểu Haskell, hãy bỏ qua những người mô tả nó là quá tải. Nó không giống như quá tải, thay vào đó, nó giống như chuyên môn hóa mẫu: bạn khai báo một mẫu mà bạn không triển khai, sau đó cung cấp các triển khai cho các trường hợp cụ thể khi bạn cần chúng. Việc gõ là đa hình tham số, việc thực hiện là bằng cách khởi tạo ad hoc nhưng nó không có ý định không bị ràng buộc: nó phải thực hiện các ngữ nghĩa dự định.
Trong Haskell (và C ++), bạn không thể nêu ra ngữ nghĩa. Trong C ++, ý tưởng "Khái niệm" đại khái là một nỗ lực để gần đúng ngữ nghĩa. Trong Felix, bạn có thể tính gần đúng ý định với các tiên đề, rút gọn, bổ đề và định lý.
Ưu điểm chính và duy nhất của quá tải (mở) trong một ngôn ngữ có nguyên tắc tốt như Felix là nó giúp dễ nhớ các tên hàm thư viện hơn, cho cả người viết chương trình và cho người xem mã.
Nhược điểm chính của quá tải là thuật toán phức tạp cần thiết để thực hiện nó. Nó cũng không phù hợp lắm với suy luận kiểu: mặc dù cả hai không hoàn toàn độc quyền, thuật toán để thực hiện cả hai đều đủ phức tạp để lập trình viên có thể không dự đoán được kết quả.
Trong C ++, đây cũng là một vấn đề vì nó có thuật toán so khớp cẩu thả và cũng hỗ trợ chuyển đổi loại tự động: trong Felix tôi đã "khắc phục" vấn đề này bằng cách yêu cầu khớp chính xác và không có chuyển đổi loại tự động.
Vì vậy, bạn có một sự lựa chọn tôi nghĩ: quá tải hoặc loại suy luận. Suy luận là dễ thương, nhưng cũng rất khó để thực hiện theo cách chẩn đoán chính xác các xung đột. Ocaml, ví dụ, cho bạn biết nơi nó phát hiện xung đột, nhưng không phải là nơi nó suy ra loại dự kiến.
Quá tải không tốt hơn nhiều, ngay cả khi bạn có một trình biên dịch chất lượng cố gắng cho bạn biết tất cả các ứng cử viên, thật khó để đọc nếu các ứng cử viên là đa hình, và thậm chí tệ hơn nếu đó là tin tặc mẫu C ++.