Чтение «Типы и языки программирования», я был впечатлен реализацией объекта, используя закрытие и запись подтипов записи (глава 18). Есть ли какая-то особая причина, по которой OCaml не поддерживает подтипирование записи (я знаю, что все-таки объекты)? На самом деле, я не могу найти язык, который поддерживает это.Почему OCaml не поддерживает запись подтипов?
ответ
Технически объекты OCaml на самом деле не поддерживают подтипирование в обычном смысле, но рядный полиморфизм. Существует много преимуществ полиморфизма строк над подтипированием, в частности, он более экспрессивный и намного лучше работает с типом вывода (подтипирование и вывод типа вообще не смешиваются).
Основная проблема с использованием структурного подтипирования или полиморфизма строк для всех записей заключается в том, что для этого требуется значительно более сложная реализация времени выполнения, а следовательно, и более дорогостоящая. Там, где простые записи могут быть тривиально переведены в простые кортежи, причем доступ к полям является просто индексированием, структурный подтипирование или полиморфизм строк требуют возможности прозрачного «среза» объекта, т. Е. Просматривать его под супертипом со снятыми случайными полями. В общем, для этого требуется либо поиск в полевых условиях путем хеширования (например, объектов Ocaml), либо методов, передающих методы, где индекс каждого поля, используемого функцией или любым из ее вызываемых лиц, должен передаваться как скрытый аргумент в дополнение к фактическая запись (например, что делает SML #).
В любом случае у Ocaml есть полиморфные записи, их просто называют объектами. Но вы можете игнорировать все классовые беспорядки вокруг них, если вам это не нужно.
Да, классный беспорядок был тем, что меня отпустило. Я новичок в OCaml, но я с нетерпением жду возможности узнать о его объектной системе. В любом случае, спасибо за ответ! –
Запись подтипирования довольно опасна с точки ввода.
Предположим, у вас есть запись с тремя полями: a, b и c. И вы хотите создать запись только с двумя полями: a и c. Компилятор не знает, какой тип вы используете, пока он не закончит чтение всей записи, и все равно в конце, не может помочь вам, если вы допустили ошибку: например, вы забыли поле b. Я полностью согласен с тем, что эта точка зрения спорна, но я думаю, что так думают люди, которые пишут ocaml.
Благодарим вас за это. Я бы поднял голову, но моя репутация слишком низкая;) –
Хм, я не совсем понимаю. Подтипирование означает, что вы можете использовать 3-полевую запись в местах, которые ожидают запись в 2-поле. Но в вашем примере вы создаете запись из двух полей (возможно, по ошибке). Даже при подтипировании компилятор позволит вам использовать его только в тех местах, которые на самом деле ожидают 2 поля (или меньше). Но это прекрасно, так как эти места никогда не будут смотреть на ваше третье поле. – max
SML # есть запись подтипирование. Объектами OCaml являются записи с подтипированием. Структурный подтипирование является мощным, но ошибки его типа часто являются загадочными. Поэтому пользователи OCaml обычно предпочитают более простые записи без подтипирования. – camlspotter
Спасибо за указание SML #! Есть ли разница между подтипированием записи в SML # и структурной типизацией объектов в OCaml? –