Введение
Типовая система в информатике. Полиморфные типовые системы в информатике.
polymorphic type systems in computer science
В информатике, класс типов — это конструкция системы типов, поддерживающая полиморфизм "ad hoc". Это достигается путем добавления ограничений к переменным типов в параметрически полиморфных типах. Такое ограничение обычно включает в себя класс типов T и переменную типа a, и означает, что a может быть инстанцирован только типом, члены которого поддерживают перегруженные операции, связанные с T.
Классы типов были впервые реализованы в языке программирования Haskell после того, как Филипп Вадлер и Стивен Блотт впервые предложили их в качестве расширения "eqtypes" в Standard ML, и изначально они были задуманы как способ реализации перегруженных арифметических и операторов равенства принципиальным образом.
Классы типов с несколькими параметрами
Типовые классы допускают множественные параметры типа, поэтому классы типов можно рассматривать как отношения между типами. Например, в стандартной библиотеке GHC класс `IArray` выражает общий интерфейс для неизменяемых массивов. В этом классе ограничение типа `IArray a e` означает, что `a` – это тип массива, содержащий элементы типа `e`. (Это ограничение полиморфизма используется, например, для реализации неразборчивых типов массивов.) Подобно мультиметодам, классы типов с несколькими параметрами поддерживают вызов различных реализаций метода в зависимости от типов нескольких аргументов и, соответственно, типов возвращаемых значений. Классы типов с несколькими параметрами не требуют поиска вызываемого метода при каждом вызове во время выполнения; вместо этого метод для вызова сначала компилируется и сохраняется в словаре экземпляра класса типа, как и в классах с одним параметром. Код Haskell, использующий классы типов с несколькими параметрами, не является переносимым, поскольку эта функция не входит в стандарт Haskell 98. Популярные реализации Haskell, GHC и Hugs, поддерживают классы типов с несколькими параметрами.
Функциональные зависимости
В Haskell классы типов были усовершенствованы, чтобы позволить программисту объявлять функциональные зависимости между параметрами типов — концепция, вдохновлённая теорией реляционных баз данных. Это означает, что программист может утверждать, что заданное присваивание некоторого подмножества параметров типов однозначно определяет остальные параметры типов. Например, общая монада `m`, несущая параметр состояния типа `s`, удовлетворяет ограничению класса типов `Monad.State s m`. В этом ограничении существует функциональная зависимость `m > s`. Это значит, что для заданной монады `m` типа класса `Monad.State`, тип состояния, доступный из `m`, однозначно определён. Это помогает компилятору в выводе типов и облегчает программирование, управляемое типами. Саймон Пейтон Джонс возражал против введения функциональных зависимостей в Haskell, ссылаясь на их сложность.
Другие подходы к перегрузке оператора
В Standard ML механизм "типов равенства" в общих чертах соответствует встроенному в Haskell классу типов Eq, однако все операторы равенства генерируются компилятором автоматически. Контроль программиста над этим процессом ограничивается указанием того, какие компоненты типа в структуре являются типами равенства, и какие переменные типа в полиморфном типе охватывают типы равенства. Модули и функторы SML и OCaml могут выполнять функцию, аналогичную классам типов Haskell, при этом принципиальное различие заключается в роли вывода типов, что делает классы типов подходящими для полиморфизма "ad hoc". Объектно-ориентированное подмножество OCaml представляет собой еще один подход, в определенной степени сопоставимый с использованием классов типов.