Ocaml - полиморфный принт и тип потери - PullRequest
10 голосов
/ 16 сентября 2011

В OCaml есть ряд функций, таких как print_int, print_endline и Printf.Я не могу сделать что-то вроде:

let n = 10 in
print n;; (* And I haven't to change `print` in case type of `n` changed *)

Это полиморфная печать, как в Java, C #, Python и других.Вместо этого у нас есть C-like с типом, явно определенным программистом.Так что я думаю, что OCaml теряет информацию о типе во время компиляции и не имеет ее во время выполнения, верно?И это причина, почему нам также нужны mli-файлы?

РЕДАКТИРОВАТЬ: Я устал писать такие функции как * print_listi *, * print_list_tuple2i * и так далее.Как я могу сделать это лучше?

1 Ответ

20 голосов
/ 16 сентября 2011

Вы правы: OCaml отбрасывает типы во время выполнения и, следовательно, никакой способ отличить ваши 10 на самом деле не является целым или десятым конструктором вариантов. Имена конструкторов также недоступны, поэтому невозможно распечатать данные.

Более того, полиморфизм OCaml является параметрическим. Вы не можете определить функции, которые работают по-разному в зависимости от типов.

Одним частичным решением этой проблемы является использование CamlP4 для автоматической генерации функций принтера для типов данных. Но, тем не менее, у вас не может быть «полигамного» отпечатка, который работает на все. Вы должны комбинировать принтеры вручную, например print_list (print_option print_int).

Я расширил OCaml, чтобы иметь такой полиморфный отпечаток (и другие приятные вещи) много лет назад. Это называется GCaml. Но не поддерживается долго.

Mli файлы не связаны с этим. Они предназначены для написания сигнатур модулей, для сокрытия реализаций для более простых интерфейсов для пользователей модулей.

...