A Система типов Хиндли - Милнера (HM) - это классическая система типов для лямбда-исчисление с параметрическим полиморфизмом. Он также известен как Дамас-Милнер или Дамас-Хиндли-Милнер . Впервые он был описан Дж. Роджер Хиндли, а затем вновь обнаружен Робином Милнером. Луис Дамас представил подробный формальный анализ и доказательство метода в своей докторской диссертации.
Среди основных примечательных свойств HM - его полнота и способность определять наиболее общий тип данной программы. без предоставленных программистом аннотаций типа типа или других подсказок. Алгоритм W - это эффективный метод вывода типа на практике, который успешно применен на больших базах кода, хотя имеет высокую теоретическую сложность. HM используется для функциональных языков. Впервые он был реализован как часть системы типов языка программирования ML. С тех пор HM был расширен способами, в первую очередь с помощью ограничений типа class, подобных тем что в Haskell.
В метод вывода типа Хиндли-Милнер позволяет выводить типы выражений и функций в качестве программ, написанных в полностью нетипизированном стиле. Будучи чувствительным к scope, он не ограничивается выводом типов только из частей исходного кода, а скорее из полных программ или модулей. Будучи способным работать с параметрическим типом, он также используется в качестве ядра для системы типа языков функционального программирования. Впервые он был применен к этому расширению в ML.
. Источником вывода типа для просто типизированного лямбда-исчисления, который был разработан Haskell Curry и Роберт Фейс в 1958 г. В 1969 г. Дж. Роджер Хиндли расширил эту работу и доказал, что их алгоритм всегда выводит самый общий тип. В 1978 году Робин Милнер, независимо от работы Хиндли, предоставил эквивалентный алгоритм, Алгоритм W. В 1982 году окончательно доказал полноту алгоритма Милнера и расширил его для поддержки систем с полиморфными ссылками.
В просто типизированном лямбда-исчислении типы начало себя константами атомарного типа или функциональные типы формы . Такие типы мономорфны. Типичными примерами являются используемые в арифметических значениях:
3: Добавление числа 3 4: Добавление числа: ->Число ->Число
В отличие от этого, нетипизированное лямбда-исчисление нейтрально для печатать вообще, и многие из его функций могут быть осмысленно применены всем типам аргументов. Тривиальный пример - функция идентичности
, который просто возвращает любое значение, к используемому. Менее тривиальные примеры параметров, такие как списки.
Хотя в целом полиморфизм означает, что операции принимают значения более чем одного полиморфизма, здесь, является параметрическим. В литературе можно найти обозначения типов, подчеркивающих параметрическую природу полиморфизма. Кроме того, константы могут быть типизированы с помощью (количественно определенного) числа типа. Например:
минусы: для всех a. a ->Список a ->Список ноль: forall a. Список а. id: для всех. a ->a
Полиморфные типы могут стать мономорфными последовательными заменами их числа. Примеры мономорфных экземпляров:
id ': String ->String nil': Номер списка
В более общем смысле, тип полиморфны, когда они содержат переменные типа, тогда как типы без них являются мономорфными.
В различных типах систем, используемых, например, в Pascal (1970) или C (1972), которые только мономорфные типы, HM разработаны с акцентом на параметрический полиморфизм. Преемники упомянутых языков, такие как C ++ (1985), сфокусировались на различных типах полиморфизма, а именно на подтипе в связи с объектно-ориентированным программированием и перегрузке. Хотя подтипирование несовместимо с HM, вариант систематической перегрузки доступен в основанной на HM системе типов Haskell.
При расширении вывода типа для простого типизированного лямбда-исчисления в сторону полиморфизма необходимо определить, когда получение экземпляров значений допустимо. В идеале это было бы разрешено при любом использовании используемого компонента, например:
(λ id.... (id 3)... (id "text")...) (λ x. X)
К сожалению, вывод типа в полиморфном лямбда-исчислении не разрешим. Вместо этого HM предоставляет let-полиморфизм вида
let id = λ x. x in ... (id 3)... (id "текст")...
ограничение механизма привязки в расширении синтаксиса выражения. Только значения, связанные в конструкции let, могут быть инстанцированы, т.е. являются полиморфными, а параметры в лямбда-абстракциях рассматриваются как мономорфные.
Дальнейшая часть этого статьи следующим образом:
Везде используется одно и то же описание системы дедукции. даже для двух алгоритмов, чтобы сделать различные формы, представленные в представленных HM, напрямую сопоставимыми.
Систему типов можно формально описать с помощью правил синтаксиса, которые фиксируют язык для выражений, типов и т. Д. Представление здесь такой синтаксис не является слишком формальным, поскольку он написан не для изучения поверхностной грамматики, а скорее для изучения глубинной грамматики, и оставляет некоторые синтаксические детали открытыми. Такая форма представления обычная. Основываясь на этом, типы типов используются для определения того, как используемые различные типы. Как и прежде, форма немного либеральна.
Выражения |
Типы |
Контекст и ввод |
Бесплатно Переменные типа |
Выражения, которые нужно набрать, соответствуют se из лямбда-исчисления расширен let-выражением, как показано в соседней таблице. Круглые скобки Заголовок "Номнозначности выражения". Приложение связывает слева и связывает, чем абстракция или конструкция сильнее.
Типы синтаксически разделены на две группы: монотипы и политипы.
Монотипы всегда обозначают определенный тип. Монотипы синтаксически представлены как термины.
Примеры монотипов, включая константы типов, такие как или и параметрические типы, такие как . Последние типы являются примерами типов типов, например, из набора , где верхний индекс указывает количество параметров типа. Полный набор функций типа в HM произвольный, за исключением того, что он должен содержать не менее , тип функций. Для удобства его часто пишут инфиксной нотацией. Например, функция, отображающая целые числа в строке, имеет тип . Опять же, скобки можно использовать для устранения неоднозначности выражения типа. Приложение связывает сильнее, чем инфиксная стрелка, которая связывает вправо.
Переменные типа допускаются как монотипы. Монотипы не следует путать с мономорфными типами, которые исключают переменные и допускают только основные термины.
Два монотипа равны, если у них одинаковые термины.
Политипы (или схемы типов) - это перечень связанных одним или используемым квантификми для всех, например .
Функция с политипом может отображать любое значение того же типа самому себе, и функция идентичности является величиной для этого типа.
В качестве другого примера, - тип отображения функций всех конечных чисел в целые числа. Функция, которая возвращает мощность набора, будет значением этого типа.
Квантификаторы могут появляться только на верхнем уровне. Например, тип исключается синтаксисом типов. В политипы входят монотипы, поэтому тип имеет также общий вид , где - монотипия.
Равенство политипов зависит от переупорядочения количественных оценок и переименования количественных чисел (-конверсия). Кроме того, количественные переменные не встречаются в монотипе, могут быть опущены.
Чтобы осмысленно объединить все еще непересекающиеся части (синтаксические выражения и типы), необходима третья часть: контекст. Синтаксически контекст - это список пар , называемые присвоениями, предположениями или привязками, каждая пара, указывающая, что значение тип . Все три части вместе дают оценку типа , что при предположениях , выражение имеет тип .
В виде , символ - квантор, связывающий переменные типа в монотипе . Переменные называются квантифицированными, и любое определение квантифицированного типа в называется системой, а все переменные несвязанного типа в называются свободными. В дополнение к количественному определению в политипах, переменные типа могут также быть связаны, встречаясь в контексте, но с обратным эффектом в правой части . В этом случае такие переменные ведут себя как константы типов. Наконец, переменная типа может быть юридически несвязанной при типе, и в этом случае все неявно качественно.
Наличие как связанных, так и несвязанных чисел типа немного необычно для языков программирования. Часто все переменные типа обрабатываются неявно и количественно. Например, в Prolog нет предложений со свободными переменными. Скорее всего, в Haskell, где все типы неявно выражаются количественно, т.е. тип Haskell a ->a
означает здесь. Связанный, а также очень необычный эффект связывания правой стороны назначений.
Как правило, происходит сочетание связанного и несвязанного типа из-за использования выражения в выражении. Постоянная функция K= дает пример. Он имеет монотипию . Можно вызвать полиморфизм с помощью . Здесь имеет тип . Свободная переменная монотипии происходит от типа , структура в окружающей области. имеет тип . Можно представить себе переменную свободного типа в типе , связанное с в типе . Но такой объем не может быть выражен в HM. Скорее привязка контекст контекстом.
Полиморфизм означает, что одно и то же выражение может иметь (возможно, бесконечно) много типов. В этой системе эти типы не связаны между собой, а скорее управляются параметры полиморфизма.
В качестве примера тождества может иметь как его тип, а также или и многие другие, но не . Наиболее общий тип этой функции - , в то время как другие конкретны и могут быть производными от общего, последовательно заменяя другой тип для типа типа, т. е. количественная переменная . Контрпример терпит неудачу, потому что замена непоследовательна.
Последовательная замена может сделать формальную, применив замену к члену типа , записанному . Как показывает пример, подстановка не только использует с порядком, которая позволяет использовать более низкую квалификацию, но также с общей количественной оценкой, которая позволяет применять замену.
Правило специализации |
Формально в HM тип является более общим, чем , формально , если некоторая количественная переменная в последовательно заменяется так, что получается , как показано на боковой панели. Этот порядок является частью определения типа системы типов.
В нашем примере применения приведет к .
При замене мономорфной (основной) тип для количественной стандартной прост, замена политипа имеет некоторые подводные камни, вызванные наличием свободных сумма. В частности, не следует заменять несвязанные переменные. Здесь исследуется как константы. Кроме того, количественная оценка может происходить только на верхнем уровне. Подставляя параметрический тип, нужно поднять его кванторы. Таблица справа уточняет правило.
В качестве альтернативы рассмотрите соответствующую нотацию для политипов без кванторов, в которых представлены другие набором символов. В таких обозначениях специализация сводится к простой последовательной замене таких чисел.
Отношение является частичным порядком и - его наименьший элемент.
Хотя специализация является типовой схемой одного из видов использования, она играет вторую роль в системе типов. Вывод типа с помощью полиморфизма сталкивается с обобщением всех типов, которые могут иметь выражение. Порядок гарантирует, что такое общее используется как наиболее общий тип выражения.
Порядок типов, может быть расширен до типов, потому что подразумеваемая совокупная оценка обеспечивается последовательной замену:
Вопреки правилу спецификации, это не часть определения, но как неявная общая количественная оценка, скорее, следствие правил типов, определенных. Переменные свободного типа в типизации заполнителями для возможного уточнения. Эффект привязки среды к переменным свободного типа в правой части , запрещающая их замену в правиле специализации, снова заключается в том, что замена должна быть согласованной и нужно будет весь набор текстов.
В этой статье мы обсудим четыре различных набора правил:
Синтаксис правил |
Синтаксис HM перенесен в синтаксис правил вывода, которые образуют тело формальной системы, с использованием типов суждений. Каждое из правил определить, какой вывод из каких посылок можно сделать. В дополнение к судебным решениям, некоторые дополнительные условия, представленные выше, представленные в качестве предписания в предпосылок.
Доказательство с использованием правил - это последовательность суждений, в которой все условия перед выводом. Приведенные ниже показывают возможный формат доказательств. Слева направо, каждая строка показывает заключение, применяемых правил и условий, либо со ссылкой на более раннюю строку (номер), если посылка является суждением или явным предикатом.
Система декларативных правил |
Боковое окно показывает правила дедукции системы типов HM. Можно грубо разделить правила на две группы:
Первые четыре правила (переменная или функция доступ), (приложение, т.е. вызов функции с одним параметром), (абстракция, то есть функции объявления) и (объявление) сосредоточены вокруг синтаксиса, представляя одно правило для каждой формы выражения. Их значение с первого взгляда, поскольку они разбирают каждое выражение, доказывают свои подвыражения и наконец, объединяют типы, найденные в соединках, с типом в заключении.
Вторая группа образована двумя предписаниями и . Они обрабатывают специализацию и обобщение типов. Хотя правило должно быть удалено из раздела по специализации выше, дополняет первое, работает в противоположном направлении. Это позволяет обобщать, то есть количественно определять переменные монотипа, не связанные в контексте.
Следующие два примера демонстрируют систему правил в действии. Здесь используются данные для типов правил.
Пример : Доказательство для где , можно записать
Пример : для демонстрации обобщения, показано ниже:
Не виден сразу, набор правил кодирует правило согласно каким-либо обстоятельствам, слегка изменяя использование моно- и политипов в правилах и . Помните, что и обозначают поли- и монотипы соответственно.
В правиле , переменные значения параметров функции добавляется в контекст с мономорфным типом через объем , а в правиле , переменная входит в среду ворф полимерной формы . Хотя в обоих случаях наличие в любом случае исключает использование правил обобщения для альтернативного назначения, это правило позволяет использовать тип параметра в -выражение, чтобы оставаться мономорфным, в то время как в let-выражении переменная может быть представлена полиморфной, возможными специализации.
Вследствие этого правила нельзя достичь, так как параметр находится в мономорфной позиции, а имеет тип , потому что был введен в let-выражение и поэтому считается полиморфным.
Правило обобщения также заслуживает внимательного изучения. Здесь полная количественная оценка, заложенная в посылке , просто перемещается в правую часть в заключении. Это возможно, поскольку не встречается в контексте свободно. Опять же, хотя это делает правило обобщения правдоподобным, на самом деле это не следствие. Напротив, правило обобщения является частью определения системы типов HM и следствием неявной общей количественной оценки.
Теперь, когда доступна система дедукции HM, можно представить алгоритм и проверить его на соответствие правилам. В качестве альтернативы можно было бы вывести его, внимательно изучив, как правила взаимодействуют и формируются доказательства. Это делается в оставшейся части этой статьи, в которой основное внимание уделяется возможным решениям, которые можно принять при проверке типизации.
Изоляция точек в доказательстве, когда решение вообще невозможно, первая группа правил, сосредоточенная вокруг синтаксиса, не оставляет выбора, поскольку для каждого синтаксического правила соответствует уникальному правилу типизации, которое определяет часть доказательства, а между выводом и предпосылками этих фиксированных частей цепочки и могли возникнуть. Такая цепочка также могла существовать между завершением доказательства и правилом для наивысшего выражения. Все доказательства должны иметь такую набросанную форму.
Поскольку единственный выбор в доказательстве в отношении выбора правила - это и цепочки, форма доказательства наводит на вопрос, можно ли сделать его более точным, где эти цепочки могут понадобиться. На самом деле это возможно и приводит к варианту системы правил без таких правил.
Система синтаксических правил |
Обобщение |
Современное лечение HM использует чисто систему правил, созданный Клиентом как промежуточный этап. В этой системе специализация используется сразу после исходных правил и объединяется с ним, а обобщение становится правилом . Здесь также определяется обобщение, чтобы всегда производить наиболее общий тип путем введения функции , которая количественно определяет все переменные монотипа не связаны в .
Формально для подтверждения того, что эта новая система правил эквивалентно исходному , нужно показать, что , который распадается на два доказательства:
Хотя согласованность можно увидеть, разложив прав ила и из в доказательств в вероятно, видно, что является неполным, так как нельзя показать в , например, но только . Тем не менее, можно доказать лишь немного более слабую версию полноты, а именно
подразумевая, что можно вывести основной тип для выражения в , что позволяет нам обобщить доказательство в конце.
Сравнение и , теперь в суждениях всех правил фигурируют только монотипии. Кроме того, форма любого возможного примера с помощью системы дедукции новая форма выражения (оба они представлены как деревья ). Таким образом, выражение должно указать форму доказательства. В форма, вероятно, будет определяться с соблюдением всех правил, кроме и , которые позволяют строить произвольно длинные ответвления (цепочки) между другими узлами.
Теперь, когда форма доказательства известна, мы уже близки к формулированию алгоритма вывода типов. Испытание на качество.
Здесь играет роль порядок за ущерб (специализации). Хотя на первый взгляд невозможно определить метод определения, есть надежда, что их можно уточнить с помощью порядка при обходе дерева доказательства, как предполагаемый алгоритм должен стать методом вывода, что в любом помещении будет определен как лучший. И действительно, можно, если посмотреть на правила , подсказывает:
Первый формирующий результат вывод должен иметь форму .
Вторая система требует, чтобы предполагаемый тип был равенством первого предпосылки. Теперь есть два, возможно, разных типов, возможно, с переменными открытого типа, которые можно сравнивать и приравнивать, если это возможно. Если это так, уточнение найдено, а если нет, типа обнаруживается снова. Известен эффективный метод «уравнять два члена» путем подстановки, Робинсона Объединение в сочетании с так называемым алгоритмом Union-Find.
Вкратце резюмируя алгоритм поиска объединения, он позволяет сгруппировать их вместе в классы эквивалентности посредством и выбрать представителя для каждого такого класса с помощью процедуры . Подчеркивая слово процедура в смысле побочного эффекта, мы явно выходим из области логики, чтобы подготовить эффективный алгоритм. Представитель объединения таким образом, что если оба и являются переменными типами, тогда представитель произвольно является одним из них, но при объединении и члене становится представителем. Предполагая создание-поиск под рукой, можно сформулировать два монотипов следующим образом:
unify (ta, tb): ta = find (ta) tb = find (tb) if оба ta, tb являются формами D p1..pn с идентичными D, n, затем unify (ta [i], tb [i]) для каждого i-го редакции else ifхотя бы один из ta, tb - это переменная типа, затем union (ta, tb) else тип ошибок совпадают »
Теперь есть набросок имеющегося алгоритма вывода, более формальное представление дается в следующем разделе. Это описано в Milner P. 370 ff. как алгоритм J.
Алгоритм J |
Представление алгоритма J Неправильное использование обозначения логического, поскольку он включает побочные эффекты, но позволяет прямое сравнение с , одновременно выражая эффективную работу. Теперь правила определяют ограниченность , что дает в заключении, где оформление помещения происходит слева направо.
Процедура специализируется на политипе на копирование термина и последовательная замена связанного типа новыми переменными монотипии. '' создает новую переменную монотипии. Вероятно, должен скопировать тип, вводящий новые переменные для количественной оценки, чтобы избежать нежелательных захватов. В целом алгоритм теперь всегда делает наиболее общий выбор, оставляя специализацию для унификации, которая сама по себе дает наиболее общий результат. Как отмечалось выше, окончательный результат должен быть обобщен до в конце, чтобы получить наиболее общий тип для данного выражения.
процедуры, используемые в алгоритме имеют стоимость около O (1), общая стоимость алгоритма близка к линейной по размеру выражения, для которого должен быть выведен тип. Это сильно отличается со многими другими попытками вывести алгоритмы вывода, которые часто оказывались NP-трудными, если не неразрешимыми отношениями. Таким образом, HM работает так же хорошо, как и лучшие полностью информированные алгоритмы проверки типов. Проверка типов здесь означает, что алгоритм не должен находить доказательство, а только проверять данное.
Эффективность несколько снижается, необходимо поддерживать привязку типа в контексте, чтобы можно было вычислить и включите , проверьте, чтобы предотвратить создание рекурсивных типов . Примером такого случая является , для которого ни один тип не может быть получен с помощью HM. На практике это небольшие сроки и не расширяющиеся структуры. Таким образом, при анализе сложности их можно рассматривать как постоянные, сохраняя затраты O (1).
В предыдущем разделе при наброске алгоритма на его доказательство намекнули с помощью металогической аргументации. Хотя это приводит к эффективному алгоритму J, неясно, правильно ли алгоритм отражает дедукции или S, которые используются семантической системой линией.
Наиболее важным моментом в приведенной выше аргументации является уточнение числа монотипа, связанного связом. Например, алгоритм смело изменяет контекст при выводе, например, , потому что переменная монотипия добавлена в контекст для параметра позже необходимо улучшить до при работе с приложением. Проблема в том, что правила дедукции не допускают такого уточнения. Утверждение, что уточненный тип может быть добавлен раньше вместо альтернативного монотипа.
Ключом к достижению формально удовлетворительного аргумента является правильное включение контекста в уточнение. Формально типизация с заменой произвольного типа.
Таким образом уточнить свободные переменные означает уточнить всю типизацию.
Алгоритм W |
Оттуда, доказательство алгоритма J приводит к алгоритму W, который только делает явными побочными эффектами, налагаемые процедуры , выражая его последовательную композицию с помощью замены . Представление алгоритма W на боковой панели по-прежнему использует побочные эффекты в операциях, выделенных курсивом, но теперь они ограничиваются генерацией новых символов. Форма суждения: , обозначающая функция с контекстом и выражением в качестве исполняющего монотипию. с заменой. - это версия без побочных эффектов создание подстановки, которая является наиболее общим объединяющим элементом.
, алгоритм W обычно считается алгоритмом HM и часто используется его литература непосредственно после системы правил, его описана Милнером на стр. 369 следующим образом. :
Хотя он считал более сложным и менее эффективным, он представил его в своей публикации перед J. Он имеет свои достоинства, когда побочные эффекты недоступны или нежелательны. Кстати, W также нужен для доказательства полноты, которая учитывается им при доказательстве корректности.
Прежде чем указать обязательство по доказательству, необходимо указать расхождение между системами правил D и S и представленными алгоритмами.
В то время, как описанная выше разработка неправильно использовала монотипии как «открытые» переменные доказательства, возможность того, что правильные переменные монотипа могли быть повреждены, была устранена введением новых чисел и надеждой на лучшее. Но есть одна загвоздка: одно из обещаний заключалось в том, что эти новые переменные будут «учитываться» как таковые. Это обещание не действует.
Имея контекст , выражение нельзя ни добиться в , и в , но алгоритмы имеют тип , где W изменяет замену , что означает, что алгоритм не может быть всех ошибок типов. Это упущение может быть легко исправлено более тщательным различением доказательства и числа монотипии.
Авторы знали о проблеме, но решили не исправлять. Можно предположить, что за этим стоит прагматическая причина. Несмотря на то, что они не были необходимы для предполагаемых приложений, они не были необходимы для предполагаемых приложений, где ни один из элементов в уже существующем контексте не имеет размер. В этом свете ненужное усложнение было отброшено в пользу более простого алгоритма. Остающийся недостаток заключается в том, что доказательство алгоритма относительно системы правил менее общего и может быть выполнено только для контекстов с как побочное условие.
Побочное условие в обязательстве полноты касается того, как вывод может дать много типов, в то время как алгоритм всегда производит один. В то же время побочное условие требует, чтобы предполагаемый тип был самым общим.
Чтобы правильно доказать обязательства, нужно сначала усилить их, чтобы активировать лемму о подстановке, распределяющую замену через и . Отсюда презентация индукции по выражению.
Еще одно обязательство по доказательству - это сама лемма о замене, то есть замена типизации, которая, в конце концов, устанавливает все-количественное определение. Последнее невозможно формально доказать, так как такого синтаксиса нет.
Чтобы сделать программирование практичным, необходимы рекурсивные функции. Центральным своим лямбда-исчисления являются то, что рекурсивные определения не доступны напрямую, но вместо этого могут быть выражены с помощью комбинатора с фиксированной точкой . Но, к сожалению, комбинатор фиксированных точек нельзя сформулировать в типизированной версии лямбда-исчисления, не оказав катастрофического воздействия на систему, как описано ниже.
Исходная статья показывает, что рекурсия может быть реализована с помощью комбинатора . Таким образом, возможное рекурсивное определение может быть сформулировано как .
В качестве альтернативы возможно расширение синтаксиса выражения и дополнительное правило ввода:
где
в основном слияние и при включении рекурсивно определенных переменных в монотипные позиции, где они встречаются слева от но как политипы справа от него. Эта формулировка, возможно, лучше всего резюмирует суть let-полиморфизма.
Несмотря на то, что вышесказанное является простым, оно имеет свою цену.
Теория типов связывает лямбда-исчисление с вычислениями и логикой. Простая модификация, приведенная выше, влияет на оба:
Перегрузка означает, что разные функции по-прежнему могут определяться и использоваться с одним и тем же именем. Большинство языков программирования, по крайней мере, обеспечивают перегрузку с помощью встроенных арифметических операций (+, <,etc.), to allow the programmer to write arithmetic expressions in the same form, even for different numerical types like int
или real
. Поскольку смесь этих разных типов в одном выражении также требует неявного преобразования, перегрузка, особенно для этих операций, часто встроена в сам язык программирования. В некоторых языках эта функция обобщена и доступна пользователю, например, в C ++.
В то время как специальная перегрузка имеет В функциональном программировании избегали затрат на вычисления как при проверке типов, так и при логическом выводе, было введено средство систематизации перегрузки, которое по форме и именам напоминает объектно-ориентированное программирование, но работает на один уровень выше. "Экземпляры" в этой систематике не являются объекты (т.е. на уровне значений), а скорее типы. В примере быстрой сортировки, упомянутом во введении, используется перегрузка в заказах со следующей аннотацией типа в Haskell:
quickSort :: Ord a =>[a] ->[ a]
H erein, тип a
не только полиморфен, но и ограничен как экземпляр некоторого класса типа Ord
, который предоставляет предикаты порядка <
и >=
используется в теле функций. Соответствующие реализации этих предикатов затем передаются в quicksorts в качестве дополнительных параметров, как только быстрая сортировка используется для более конкретных типов, обеспечивая единственную реализацию перегруженной функции quickSort.
Поскольку «классы» допускают только один тип в качестве аргумента, результирующая система типов по-прежнему может обеспечивать вывод. Кроме того, классы типов могут быть оснащены неким порядком перегрузки, позволяющим упорядочить классы как решетку.
Параметрический полиморфизм подразумевает, что сами типы передаются как параметры, как если бы это были настоящие ценности. Передается в качестве аргументов в соответствующие функции, а также в «функции типов», как в «параметрических» константах типов, приводит к вопросу, как более правильно типизировать сами типы. Мета-типы используются для создания еще более выразительной системы типов.
К сожалению, только унификация больше не разрешима при наличии метатипов, делая вывод типа невозможным в этой степени общности. Кроме того, предположение о типе всех типов, который включает себя в качестве типа, приводит к парадоксу, как и в случае множества всех множеств, поэтому нужно действовать поэтапно по уровням абстракции. Исследование лямбда-исчисления второго порядка, на один шаг вверх, показало, что вывод типа неразрешим в этой общности.
В Haskell были введены части одного дополнительного уровня под названием kind, где они используются для ввода монад. Виды оставлены неявными, работая за кулисами во внутренней механике системы расширенных типов.
Попытки объединить подтипирование и вывод типа вызвали некоторое разочарование. Хотя вывод типа необходим в объектно-ориентированном программировании по той же причине, что и в функциональных языках, такие методы, как HM, не могут использоваться для этой цели. Система типов с подтипами, обеспечивающая объектно-ориентированный стиль, например Карделли - его система .
Такие объекты будут неизменными в контексте функционального языка, но система типов позволит использовать объектно-ориентированный стиль программирования, и метод вывода типа может быть повторно использован в императивные языки.
Правило выделения подтипов для типов записей:
Синтаксически выражения записи будут иметь форму
и иметь правило типа, ведущее к указанному выше типу. Такие значения записи могут затем использоваться таким же образом как объекты в объектно-ориентированном программировании.