Полиморфизм (информатика): различия между версиями

[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
отмена правки 82400656 участника Yanpas даже не близко
→‎Классы типов: дополнение
Строка 276:
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>. Благодаря этому, функция типизируется единственным образом, несмотря на обращение к [[перегрузка функций|перегруженной]] функции из её тела.
 
Встроенная поддержка {{iw|Класс типов|классов типов|en|Type class}} была впервые реализована в языке [[Haskell]], но они также могут быть введены в любой [[параметрический полиморфизм|параметрически полиморфный]] язык путём простого [[препроцессор|препроцессинга]]{{sfn|Wadler - How to make ad-hoc polymorphism less ad hoc|с=1-2}}, а также реализованы [[идиома (программирование)|идиоматически]] (см., например, [[язык модулей ML#Реализация альтернативных моделей]]). Однако, непосредственная поддержка может упрощать [[автоматическое рассуждение]] о смысле программ.
 
{{iw|Equality type|Типы, допускающие проверку на равенство ({{lang-en2|equality types}})|en|Intuitionistic_type_theory#Equality_type}} в Хаскеле реализуются как инстансы класса типов <code>Eq</code> (обобщая [[переменная типа#Специальные переменные типа|переменные типа, допускающего проверку на равенство ({{lang-en2|equality type variables}})]] из {{nobr|[[Standard ML]]}}):