Haskell стирает типы?

Стирает ли Haskell типы, и если да, то чем это похоже/не похоже на стирание типов, происходящее в Java?


person Bittercoder    schedule 18.09.2012    source источник
comment
Я не уверен, что в Java есть правильное стирание типов: gergo.erdi. ху/блог/   -  person Cactus    schedule 18.09.2012
comment
Согласен - в этой статье Роберта Докинса и Сэмюэля З. Гайера из Университета Тафтса о проверке байт-кода для Haskell также есть некоторые сведения о стирании типов при реализации компилятора Haskell. cs.princeton.edu/~rdockins/pubs/TR- 2007-2.pdf   -  person Bittercoder    schedule 18.09.2012
comment
Стирание типов в Java ограничено дженериками, что позволяет проверять типы во время выполнения, но не аргументы универсального типа. Это было сделано для обеспечения обратной совместимости.   -  person scarfridge    schedule 18.09.2012


Ответы (2)


Предупреждение: опыт+вывод. Проконсультируйтесь с кем-нибудь, кто работает с обоими компиляторами для The Truth.

В том смысле, что проверка типов выполняется во время компиляции, а некоторые сложные функции системы типов сводятся к гораздо более простым языковым конструкциям, да, но несколько иначе, чем в Java.

Сигнатура типа не создает накладных расходов во время выполнения. Компилятор Haskell хорош в преобразовании программ (у него больше свободы действий, потому что порядок выполнения во многих случаях не указывается программистом), он автоматически встраивает соответствующие определения и приспосабливает полиморфные (= java-универсальные) функции к определенному типу. и т. д., как он считает нужным, если это поможет. Это похоже на стирание типа Java, но более важный аспект.

По сути, в Haskell не требуется приведения типов для обеспечения безопасности типов, потому что Haskell с самого начала спроектирован так, чтобы обеспечивать безопасность типов. Мы не прибегаем к превращению всего в объект и не возвращаем их обратно, потому что полиморфная (универсальная) функция действительно работает с любым типом данных, неважно, типами указателей или неупакованные целые числа, это просто работает, без обмана. Таким образом, в отличие от Java, приведение типов не является функцией компиляции полиморфного (универсального) кода. Пользователи Haskell склонны считать, что если вы выполняете приведение типов, вы в любом случае попрощались с безопасностью типов.

В качестве прекрасного примера того, как обеспечение корректности статического типа кода во время компиляции может избежать накладных расходов во время выполнения, в Haskell есть конструкция newtype, которая является типобезопасной оболочкой для существующего типа, и она полностью скомпилирована — все построение и уничтожение просто не происходит во время выполнения. Система типов гарантирует, что во время компиляции она используется правильно, ее нельзя получить во время выполнения, кроме как с помощью функций доступа (с проверкой типов).

Полиморфные (общие) функции не имеют полиморфных накладных расходов. Перегруженные функции Haskell (методы экземпляра интерфейса Java) имеют накладные расходы в том смысле, что существует неявный словарь функций, используемый для того, что кажется программистам Java поздним связыванием, но на самом деле, опять же, определяется во время компиляции.

Резюме: да, даже больше, чем в Java, и нет, их все равно никогда не было во время выполнения, чтобы стереть.

person AndrewC    schedule 18.09.2012
comment
Спасибо, Эндрю, резюме в конце зажгло меня лампочками ... отличное объяснение - person Bittercoder; 18.09.2012

C и Pascal имеют стирание типов. Java позволяет проверять классы во время выполнения — даже динамически загружаемые!

То, что делает Haskell, гораздо ближе к Pascal, чем к Java.

person MathematicalOrchid    schedule 18.09.2012