Saya memilih untuk memberikan kelas tipe-overloading dan multi-tipe biasa dalam bahasa saya, Felix.
Saya menganggap (terbuka) kelebihan beban penting, terutama dalam bahasa yang banyak jenis numeriknya (Felix memiliki semua tipe numerik C). Namun tidak seperti C ++ yang menyalahgunakan kelebihan dengan membuat templat bergantung padanya, Felix polimorfisme adalah parametrik: Anda perlu kelebihan muatan untuk templat di C ++ karena templat di C ++ dirancang dengan buruk.
Kelas tipe disediakan di Felix juga. Bagi mereka yang tahu C ++ tetapi tidak grok Haskell, abaikan mereka yang menggambarkannya sebagai overloading. Ini bukan seperti overloading, melainkan seperti spesialisasi templat: Anda mendeklarasikan templat yang tidak Anda terapkan, lalu memberikan implementasi untuk kasus-kasus tertentu sesuai kebutuhan Anda. Pengetikan bersifat parametrik polimorfik, implementasinya adalah dengan instantiasi ad hoc tetapi tidak dimaksudkan untuk tidak dibatasi: ia harus mengimplementasikan semantik yang dimaksud.
Di Haskell (dan C ++) Anda tidak bisa menyatakan semantiknya. Dalam C ++ ide "Konsep" kira-kira merupakan upaya untuk mendekati semantik. Dalam Felix, Anda dapat memperkirakan maksud dengan aksioma, reduksi, lemma, dan teorema.
Keuntungan utama, dan satu - satunya kelebihan (terbuka) dalam bahasa berprinsip baik seperti Felix adalah membuatnya lebih mudah untuk mengingat nama fungsi pustaka, baik untuk penulis program dan untuk peninjau kode.
Kerugian utama dari kelebihan beban adalah algoritma kompleks yang diperlukan untuk mengimplementasikannya. Itu juga tidak cocok dengan inferensi tipe: meskipun keduanya tidak sepenuhnya eksklusif, algoritma untuk melakukan keduanya cukup kompleks, pemrogram mungkin tidak akan dapat memprediksi hasilnya.
Dalam C ++ ini juga masalah karena memiliki algoritma pencocokan ceroboh dan juga mendukung konversi tipe otomatis: di Felix I "memperbaiki" masalah ini dengan memerlukan pencocokan yang tepat dan tidak ada konversi tipe otomatis.
Jadi Anda punya pilihan saya pikir: overloading atau ketik inferensi. Inferensi itu lucu, tetapi juga sangat sulit untuk diterapkan dengan cara yang mendiagnosis konflik dengan benar. Ocaml, misalnya, memberi tahu Anda di mana ia mendeteksi konflik, tetapi tidak dari mana ia menyimpulkan tipe yang diharapkan.
Overloading tidak jauh lebih baik, bahkan jika Anda memiliki kompiler berkualitas yang mencoba memberi tahu Anda semua kandidat, mungkin sulit dibaca jika kandidatnya polimorfik, dan lebih buruk lagi jika itu adalah peretas template C ++.