Benim dilim Felix sıradan aşırı yükleme ve çok tip tipi sınıfları sağlamayı seçti.
Özellikle aşırı sayıda sayısal tip olan bir dilde (Felix'in tüm C'nin sayısal tiplerine sahip olduğu) bir dilde (açık) aşırı yüklemeyi gerekli görüyorum. Bununla birlikte, şablonları bağımlı hale getirerek aşırı yüklemeyi kötüye kullanan C ++ 'dan farklı olarak, Felix polimorfizmi parametriktir: C ++' daki şablonlar kötü tasarlanmış olduğundan C ++ 'daki şablonlar için aşırı yüklemeye ihtiyacınız vardır.
Tür sınıfları da Felix'te verilmektedir. C ++ bilen ancak Haskell'i bilmeyenler için, aşırı yükleme olarak tanımlayanları görmezden gelin. Uzaktan aşırı yükleme gibi değildir, bunun yerine şablon uzmanlığı gibidir: uygulamadığınız bir şablon bildirir, ardından ihtiyacınız olan belirli durumlar için uygulamalar sağlarsınız. Yazım parametrik olarak polimorfiktir, uygulama geçici örnekleme yoluyladır, ancak kısıtlayıcı olması amaçlanmamıştır: amaçlanan semantiği uygulamak zorundadır.
Haskell'de (ve C ++) anlambilimi ifade edemezsiniz. C ++ 'da "Kavramlar" fikri kabaca anlambilime yaklaşma girişimidir. Felix'te niyeti aksiyomlar, indirimler, lemmalar ve teoremlerle yaklaşık olarak tahmin edebilirsiniz.
Felix gibi iyi ilkeli bir dilde (açık) aşırı yüklemenin ana ve tek avantajı, hem program yazarı hem de kod inceleyici için kütüphane işlev adlarını hatırlamayı kolaylaştırmasıdır.
Aşırı yüklenmenin birincil dezavantajı, onu uygulamak için gereken karmaşık algoritmadır. Ayrıca, tür çıkarımıyla da pek iyi oturmuyor: ikisi tamamen özel olmasa da, her ikisini de yapan algoritma programcının muhtemelen sonuçları tahmin edemeyeceği kadar karmaşıktır.
C ++ 'da özensiz bir eşleme algoritmasına sahip olduğu ve aynı zamanda otomatik tip dönüşümleri desteklediği için bu da bir sorundur: Felix'te tam bir eşleşme ve otomatik tip dönüşümü gerektirmeyerek bu sorunu "düzelttim".
Sanırım bir seçeneğiniz var: aşırı yükleme veya tip çıkarım. Çıkarım şirin, ancak çatışmaları doğru bir şekilde teşhis edecek şekilde uygulamak da çok zor. Örneğin Ocaml, bir çatışmayı nerede saptadığını, ancak beklenen türü nereden çıkardığını söylemez.
Aşırı yükleme çok daha iyi değil, tüm adayları anlatmaya çalışan kaliteli bir derleyiciniz olsa bile, adayların polimorfik olup olmadığını okumak zor olabilir ve hatta C ++ şablon hackery ise daha da kötü olabilir.