Вы пытаетесь изменить тип значения. Это то, что действительно не допускается системой типов. Система типов существует специально, поэтому вы не можете сделать это (случайно).
Тем не менее иногда есть причины, по которым нужно это делать. Обычно для производительности. Функция для этого Obj.magic : 'a -> 'b
. Как показывает тип, Obj.magi c принимает любой тип и выводит любой другой тип. Он меняет тип как на волхвов c. :)
Это следует делать только в точно контролируемых ситуациях. Вы должны знать, что вы делаете, и это нормально делать при использовании Obj.magi c. Лучше всего аннотировать типы вокруг Obj.magi c настолько явно, насколько это возможно, чтобы вы не получили никаких случайных результатов. В вашем случае укажите тип для ввода и вывода Bigarrays.
Внутренне Bigarrays - это просто блок памяти с некоторым подсчетом ссылок для операций среза. Для методов get / set, оптимизирующих в зависимости от типа массива, используется некий компилятор magi c. Поэтому доступ к массиву должен быть правильно выровнен по типу, к которому вы обращаетесь Например, не пытайтесь получить подмассив со смещением 1 массива int8 и обращаться к нему как с плавающей точкой. Это не удастся на многих процессорах. Но использование их прямо должно работать.
Позвольте мне повторить это: остерегайтесь того, что вы делаете что-то, чтобы обойти систему типов. Obj.magi c вообще не проверяет, что вы делаете что-то вменяемое. Твоя работа - знать, что ты там делаешь. Я уже разыграл Bigarrays с помощью Obj.magi c и считаю, что это безопасно. Если я ошибаюсь, то это должно быстро sh, поскольку Obj.magi c обычно не выживает при неправильном использовании.