Ответ 1
Да, это явно недокументировано нарочно. Для пяти видов использования Obj
я вижу (или пишу сам, что более тревожно), два из них необоснованны, два из них - способ избежать более чистого изменения дизайна, которое было бы полезно в любом случае, и один из них подлинное "хорошее решение" для сложной проблемы.
Obj
раскрывают только операции с типом, позволяющие исследовать и обрабатывать представление OCAMl во время выполнения. Вам не нужна документация для этих функций, они очевидны, но вам нужно знать о представлении данных OCaml (я узнал об этом с помощью этого документа, но руководство ocaml также документирует его), и если вы хотите взломать его, вы должны знать о времени выполнения, чтобы знать, что безопасно, а что нет "т. Как правило: нет.
Вот несколько законных применений Obj:
-
при компиляции программ Coq в программы OCaml; система типа Coq более мощная, она может печатать вещи, которые OCaml будет отклонять, поэтому переводчик Coq- > Ocaml вставляет
Obj.magic
вызовы, чтобы заставить OCaml принять его вывод. -
при кодировании GADT в OCaml 3.x, которые его не поддерживали - они были добавлены к 4.00. Существует одна кодировка с равенством и функционалом на уровне модуля (см. этот пост или эта работа), но более общий (используется в генераторе парсера menhir, который является отличной заменой для ocamlyacc, см. этот документ (PDF)) использует Obj.magic
-
при сортировке данных с использованием какой-либо (самодельной) информации о времени выполнения. Модуль
Marshal
OCaml уже не является безопасным по типу (по понятной причине), и если вам нужен другой вид сортировки в другом контексте (например, в/из запросов и результатов для SQL-сервера, как это было в my macaque) вам понадобится какой-то небезопасный листинг.