Почему OCaml не поддерживает запись подтипов записи? - программирование
Подтвердить что ты не робот

Почему OCaml не поддерживает запись подтипов записи?

Чтение "Типы и языки программирования", я получил впечатление от реализации объекта, используя закрытие и запись подтипов (глава 18). Есть ли какая-то особая причина, по которой OCaml не поддерживает подтипирование записи (я знаю, что все-таки объекты)? На самом деле, я не могу найти какой-либо язык, который бы поддерживал это.

4b9b3361

Ответ 1

Технически объекты OCaml на самом деле не поддерживают подтипирование в обычном смысле, а полиморфизм строк. Существует много преимуществ полиморфизма строк над подтипированием, в частности, он более выразителен и намного лучше работает с типом вывода (подтипирование и вывод типа вообще не смешиваются).

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

В любом случае Ocaml имеет полиморфные записи, их просто называют объектами. Но вы можете игнорировать все классовые беспорядки вокруг них, если вам это не нужно.

Ответ 2

Подтипирование записей довольно опасно на вводной точке.

Скажем, у вас есть запись с тремя полями: a, b и c. И вы хотите создать запись только с двумя полями: a и c. Компилятор не знает, какой тип вы используете, пока он не закончит чтение всей записи, и все равно в конце, не может помочь вам, если вы допустили ошибку: например, вы забыли поле b. Я полностью согласен, что эта точка зрения спорная, но я думаю, что, как люди, которые пишут OCaml думать.