Стирает ли Haskell типы, и если да, то чем это похоже/не похоже на стирание типов, происходящее в Java?
Haskell стирает типы?
Ответы (2)
Предупреждение: опыт+вывод. Проконсультируйтесь с кем-нибудь, кто работает с обоими компиляторами для The Truth.
В том смысле, что проверка типов выполняется во время компиляции, а некоторые сложные функции системы типов сводятся к гораздо более простым языковым конструкциям, да, но несколько иначе, чем в Java.
Сигнатура типа не создает накладных расходов во время выполнения. Компилятор Haskell хорош в преобразовании программ (у него больше свободы действий, потому что порядок выполнения во многих случаях не указывается программистом), он автоматически встраивает соответствующие определения и приспосабливает полиморфные (= java-универсальные) функции к определенному типу. и т. д., как он считает нужным, если это поможет. Это похоже на стирание типа Java, но более важный аспект.
По сути, в Haskell не требуется приведения типов для обеспечения безопасности типов, потому что Haskell с самого начала спроектирован так, чтобы обеспечивать безопасность типов. Мы не прибегаем к превращению всего в объект и не возвращаем их обратно, потому что полиморфная (универсальная) функция действительно работает с любым типом данных, неважно, типами указателей или неупакованные целые числа, это просто работает, без обмана. Таким образом, в отличие от Java, приведение типов не является функцией компиляции полиморфного (универсального) кода. Пользователи Haskell склонны считать, что если вы выполняете приведение типов, вы в любом случае попрощались с безопасностью типов.
В качестве прекрасного примера того, как обеспечение корректности статического типа кода во время компиляции может избежать накладных расходов во время выполнения, в Haskell есть конструкция newtype
, которая является типобезопасной оболочкой для существующего типа, и она полностью скомпилирована — все построение и уничтожение просто не происходит во время выполнения. Система типов гарантирует, что во время компиляции она используется правильно, ее нельзя получить во время выполнения, кроме как с помощью функций доступа (с проверкой типов).
Полиморфные (общие) функции не имеют полиморфных накладных расходов. Перегруженные функции Haskell (методы экземпляра интерфейса Java) имеют накладные расходы в том смысле, что существует неявный словарь функций, используемый для того, что кажется программистам Java поздним связыванием, но на самом деле, опять же, определяется во время компиляции.
Резюме: да, даже больше, чем в Java, и нет, их все равно никогда не было во время выполнения, чтобы стереть.
C и Pascal имеют стирание типов. Java позволяет проверять классы во время выполнения — даже динамически загружаемые!
То, что делает Haskell, гораздо ближе к Pascal, чем к Java.