Данные, используемые полиморфных печати и типа потерять


В 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?

EDIT: я устал писать функции типа * print_listi*, * print_list_tuple2i* и так далее. Как я могу сделать это лучше?

1   10   2011-09-16 13:10:18

1 ответ:

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

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

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

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

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