Открыть главное меню

Изменения

 
=== Классы типов ===
{{main|:en:Type class|l1=Классы типов ({{ref-en}})}}
 
{{iw|Класс типов||en|Type class}} реализует единую независимую таблицу виртуальных методов для множества ([[Параметрический полиморфизм|универсально]] [[переменная типа#Связывание и квантификация переменных типа|квантифицированных]]) типов. Этим классы типов отличаются от [[класс (объектно-ориентированное программирование)|классов]] в [[Объектно-ориентированное программирование|объектно-ориентированном программировании]], где всякий объект всякого ({{iw|ограниченная квантификация|ограниченно|en|Bounded quantification}} [[переменная типа#Связывание и квантификация переменных типа|квантифицированного]]) типа сопровождается указателем на таблицу виртуальных методов{{sfn|Wadler - How to make ad-hoc polymorphism less ad hoc|с=3}}. Классы типов являются не типами, но категориями типов; их инстансы представляют собой не значения, а типы.
squares3 (x, y, z) = (square x, square y, square z)
</source>
 
Поскольку операция умножения реализуется физически различным образом для [[Целый тип|целых]] и [[Число с плавающей запятой|чисел с плавающей запятой]], в отсутствии классов типов уже здесь потребовались бы две [[перегрузка функций|перегруженные]] функции <code>square</code> и восемь [[перегрузка функций|перегруженных]] функций <code>squares3</code>, а в реальных программах со сложными структурами данных [[дублирование кода|дублирующегося кода]] оказывается намного больше. В [[Объектно-ориентированное программирование|объектно-ориентированном программировании]] проблемы такого рода решаются посредством {{iw|Динамическая диспетчеризация|динамической диспетчеризации|en|Dynamic dispatch}}, с соответствующими накладными расходами. Класс типов осуществляет диспетчеризацию статически, сводя [[Параметрический полиморфизм|параметрический]]{{переход|#параметрический полиморфизм|text}} и [[ad hoc полиморфизм|{{nobr|ad hoc}}]]{{переход|#Ad hoc полиморфизм|text}} полиморфизм в единую модель{{sfn|Wadler - How to make ad-hoc polymorphism less ad hoc|с=1-2}}. С точки зрения параметрического полиморфизма, класс типов имеет параметр ([[переменная типа|переменную типа]]), пробегающий множество типов. С точки зрения {{nobr|ad hoc}} полиморфизма, это множество не только дискретно, но и задано явным образом до уровня реализации. Проще говоря, [[сигнатура функции|сигнатура]] <code>square :: Num a => a -> a</code> означает, что функция [[Параметрический полиморфизм|параметрически полиморфна]], но ''спектр типов'' её параметра ограничен лишь теми типами, что принадлежат к классу типов <code>Num</code>. Благодаря этому, функция типизируется единственным образом, несмотря на обращение к [[перегрузка функций|перегруженной]] функции из её тела.
 
Анонимный участник