2017-02-03 4 views
0

Для любого массива в OCaml я хочу получить размер элемента массива, сначала получив его тип.Как получить тип элемента массива в OCaml

# let element_type = Array.element_type arr;; 
# let element_size = of_int (sizeof element_type);; 

Однако функция Array.element кажется недоступной. Что еще я могу сделать?

ответ

2

OCaml статически типизирован. Существует (вообще) не говорить о типах или их размерах во время выполнения.

С другой стороны, ничто не мешает модулю создавать собственные кодировки для типов. Модуль Bigarray делает это, например. Возможно, это то, о чем вы думаете.

# let a = Bigarray.Array1.create Bigarray.int16_unsigned 
      Bigarray.c_layout 100;; 
val a : 
    (int, Bigarray.int16_unsigned_elt, Bigarray.c_layout) 
    Bigarray.Array1.t = <abstr> 
# Bigarray.kind_size_in_bytes (Bigarray.Array1.kind a);; 
- : int = 2 
+0

функция Я ищу должен выглядеть следующим образом: VAL тип: «массив ->» а. Это не время работы. Я просто надеюсь, что эта функция может обрабатывать более общие случаи. –

+0

У меня возникли проблемы с пониманием того, что вы подразумеваете под функцией, которая не работает. Функция типа, который вы здесь указываете, вернет * значение * типа ''a'. Он не возвращает сам тип. Примером функции с этим типом является 'let f a = a. (0)'. –

4

Тип не является значением, он не имеет представления в памяти. Типы существуют только в исходном коде и используются средством проверки типов для статической проверки отсутствия определенных ошибок во время выполнения. Типы стираются из программы во время компиляции. Нет представления типа времени, как на других языках, таких как Java и C++.

Все значения представлены равномерно в OCaml, либо как немедленное целое число, либо как указатель на кучу. Следовательно, все значения имеют одинаковый размер, равный размеру машинного слова. Более того, строго говоря, представление стоимости является специфичным для реализации, и вы никогда не должны обращаться к нему напрямую. OCaml не является C, и он заботится о представлении памяти (и абстрагирует его). Так что попытка проникнуть во внутренние органы - плохая идея.

После пояснения в комментариях стало очевидно, что вы говорили о типе массива из библиотеки Ctypes. Библиотека Ctypes предоставляет интерфейс для языка C (в обоих направлениях) и представляет типы C как значения OCaml. Они также предоставляют тип CArray.t, который представляет C-массивы как значения OCaml. Для этого массива, вы определенно можете получить размер, используя Ctypes.CArray.element_type функцию, например,

let sizeof_element arr = sizeof (CArray.element_type arr) 
+0

Спасибо! Я читаю этот https://realworldocaml.org/v1/en/html/foreign-function-interface.html и пример для примера A. В этом примере он использует Array.element_type. Я думал, что эта функция может быть устаревшей, но у нас должны быть некоторые альтернативы. –

+0

В этом примере OCaml использует функцию qsort в C (я знаю, что OCaml имеет свой собственный вид) для сортировки массива. qsort в C требует размера элемента, который является проблемой, которую я пытаюсь решить. –

+0

А теперь это имеет смысл, ваш вопрос о библиотеке 'Ctypes' и' Ctypes.CArray'. В примере в книге, вероятно, используется старое имя «Массив», которое сбивает с толку (как вы можете видеть). Замените все вхождения 'Array' на' CArray'. – ivg

Смежные вопросы