Модуль Obj
в основном имеет дело со структурой и интерпретацией значений OCaml в куче.Если вы хотите понять, что это значит, вы должны прочитать главу 18 руководства OCaml , «Взаимодействие C с Objective Caml».
Причина, по которой это недокументировано, двоякая: прежде всего, функции ужасно небезопасны.Существует просто функция no total с типом 'a -> 'b
, так что вы можете видеть, что Obj.magic
должна делать совсем немного, если она вообще должна что-то возвращать.На самом деле это просто дыра в системе типов, «лицензия на убийство».Во-вторых, модуль позволяет вам заглядывать в кучу по собственному желанию, фактически предоставляя моральный эквивалент указателей Си для аннулирования.Это вместе с неограниченным приведением позволяет вам делать все, что вы захотите от OCaml .
Однако для Obj
существует законное использование.Я считаю более 100 вхождений Obj.magic
в источниках, особенно в коде для Printf
и Scanf
.Другое законное использование - для операций с хвостовой рекурсивностью списка, , при условии, что вы можете доказать, что код является типобезопасным и потокобезопасным .
Если вы не возражаете против самоподключения, Вот пример небезопасной операции, заключенной в безопасный интерфейс, вместе с доказательством («Поскольку на каждом шаге ячейка cons свежа ...»), что она действительно безопасна, и вот еще один .