Будьте осторожны с слишком большим количеством абстракций: хорошо скрывать типы (то есть использовать абстрактные типы), но компилятор OCaml использует типы манифеста для выполнения некоторых оптимизаций. Абстрагирование типов будет препятствовать их выполнению компилятором.
Один пример, который может быть интересен в вашем случае, состоит в том, что OCaml имеет два представления массивов: стандартные и плоские массивы с плавающей точкой. Если компилятор знает тип элементов в массиве, он может напрямую обращаться к массиву, используя правильное представление. Но если типы элементов являются абстрактными, компилятор добавит тест для выбора между двумя представлениями.
Если вы работаете с матрицами чисел с плавающей точкой, вы должны сохранять манифест типов, чтобы компилятор генерировал наиболее эффективный код при доступе к этим массивам.
Пример:
let init_array t x =
for i = 0 to Array.length t - 1 do
t.(i) <- x
done
намного медленнее (в нативном коде), чем
let init_float_array t (x : float) =
for i = 0 to Array.length t - 1 do
t.(i) <- x
done
, поскольку init_array
является полиморфным, а init_float_array
- мономорфным для массивов с плавающей точкой.