Подтвердить что ты не робот

Имеет ли типы стирания haskell?

Стирает ли Haskell типы, и если да, то каким образом это похожее/не похожее на стирание типа, которое происходит в Java?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

Что делает Haskell намного ближе к Pascal, чем к Java.