Ocaml типы

Jan 12, 2019 12:50

В Ocaml'е, как известно, конструкторы значений не являются функциями.
Сделано это по ряду соображений, которые Ксавье Леруа изложил в
комментарии http://caml.inria.fr/pub/ml-archives/caml-list/2001/08/47db53a4b42529708647c9e81183598b.fr.html

Вкраце - это не имеет никакого отношения к производительности, а
обусловлено исторически-стилистическими соображениями и небольшим упрощением
компилятора.

Синтаксис декларации типа определён ещё в статье Милнера от 1978-го года
(до рождения половины посетителей куздрятника), и с тех пор он почти не
изменился. Милнер ссылался на статью Хиндли, которая ещё на десяток лет
старше, и, видимо, старался использовать сходные обозначения. В частности,
как и Хиндли, он использовал перечисления параметров через запятую.
Кстати, оттуда же идёт произношение 'a как "альфа", а 'b как "бета"
(к сожалению, я так до сих пор и не знаю, как произносится 'c).

В статье Милнера первой же формулой идёт тип полиморфной функции map:

(('a -> 'b) * 'a list) -> 'b)

И с тех пор у нас в языках семейства ML идёт запись конструктора
типов с небольшим арабским акцентом - слева направо и обязательно в скобочках.
В основном языке всё наоборот - имя функции слева, а параметры через пробел справа:

type ('a, 'b, 'c) triad = ...

let triad' a b c = ...

В языках с синтаксисом Mirand'ы это всё, разумеется, исправили, но Ocaml
несёт груз традиции.

А вот более неприятно то, что конструктор значения в синтаксисе
ML имеет ровно один параметр. То есть, мы можем написать

type 'a pair = Pair of 'a*'a

но не можем написать

type 'a pair = Pair of 'a 'a

С другой стороны, внутри компилятора Ocaml кортеж 'a*'a естественным образом
разбивается на два параметра. Это непонятное место, где реализация
противоречит языку и было одним из мотиваторов сделать конструкторы
значений не-функциями. Кстати говоря, в более традиционном SML
у очень многих функций параметры сгруппированы в пары;
это тепло и лампово, но крайне неудобно.
Previous post Next post
Up