Алексей Махоткин

домашняя страница

Критика Standard ML — выведение типов

Andrew W. Appel, «Критика Standard ML», оглавление

В ML никогда (ну, почти никогда: подробности см. в разделе Перегрузка) не требуется объявлять типы переменных, функций и их формальных параметров. Компилятор может самостоятельно вывести типы для этих идентификаторов, и проверяет, что переменные повсеместно используются должным образом. Таким образом, ML обеспечивает преимущества проверки типов на стадии компиляции с краткостью неуказания типов.

Это удобно, но, конечно же, программы из-за этого вовсе не уменьшаются в невероятное число раз: в языках с необходимостью объявления типов, конечно же, объявления типов занимают не так уж много места. Большое преимущество выведения типов в том, что компилятор использует самый общий (полиморфный) тип для каждой функции. Из-за этого программист избавлен от необходимости слишком рано указывать типы функций.

Например, предположим, что мы пишем функцию length, которая вычисляет количество целых в списке:

fun length (head::rest) = 1 + length(rest)
  | length (nil) = 0
Список в ML может быть пустым, или же nil, или состоять из “cons”-ячейки, состоящей из «головы» (первого элемента) и «хвоста» (остальных элементов). Таким образом, list — это тип дизъюнктивного объединения, или datatype, такого вида:
datatype 'a list = nil | :: of 'a * 'a list
Конструкторами этого типа данных являются nil и :: (произносится «конс»). Все элементы списка должны быть одного и того же типа; если этот тип называется, например, α, то список называется α list. Так как на наших клавиатурах нет греческих букв, то мы пишем α в виде ‘a. Удобно сделать так, чтобы оператор :: был инфиксным и право-ассоциативным, чтобы 1::2::3::nil был списком из первых трех положительных целых.)

Так как программисту не приходится указывать тип элемента списка head, то нет соблазна слишком рано задать его как int. Таким образом, эта функция длины списка имеет тип α list → int для каждого α, и может применяться к спискам строк, спискам целых, спискам списков, и т. д.

Comments