Arrays 如何在OCaml中获取数组的元素类型

Arrays 如何在OCaml中获取数组的元素类型,arrays,ocaml,Arrays,Ocaml,给定OCaml中的任何数组,我希望通过首先获取其类型来获取数组元素的大小 # let element_type = Array.element_type arr;; # let element_size = of_int (sizeof element_type);; 但是,函数Array.element似乎不再可用。我还能做什么?OCaml是静态类型的。(通常)在运行时无法谈论类型或它们的大小 另一方面,没有什么可以阻止模块为类型创建自己的编码。例如,Bigarray模块就是这样做的。可能你

给定OCaml中的任何数组,我希望通过首先获取其类型来获取数组元素的大小

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

但是,函数Array.element似乎不再可用。我还能做什么?

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
#设a=Bigarray.Array1.create Bigarray.int16u无符号
Bigarray.c_布局图100;;
瓦拉:
(int,Bigarray.int16_unsigned_elt,Bigarray.c_布局)
Bigarray.Array1.t=
#Bigarray.kind_size_(Bigarray.Array1.kind a);;
-:int=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
#设a=Bigarray.Array1.create Bigarray.int16u无符号
Bigarray.c_布局图100;;
瓦拉:
(int,Bigarray.int16_unsigned_elt,Bigarray.c_布局)
Bigarray.Array1.t=
#Bigarray.kind_size_(Bigarray.Array1.kind a);;
-:int=2

类型不是值,它没有任何内存表示形式。类型仅存在于源代码中,由类型检查器用于静态验证是否存在某些运行时错误。在编译过程中,这些类型将从程序中删除。没有类型的运行时表示,如其他语言如java和C++。p> 所有值在OCaml中都统一表示为立即整数或堆指针。因此,所有值都具有相同的大小,即等于一个机器字的大小。此外,严格来说,值表示是特定于实现的,您不应该直接访问它。OCaml不是C,它负责内存表示(并对其进行抽象)。因此,试图挖掘其内部是一个坏主意

在注释中进行了澄清之后,很明显您所谈论的是来自Ctypes库的数组类型。Ctypes库提供了C语言的接口(双向),并将C类型表示为OCaml值。它们还提供了一个
CArray.t
类型,将C数组表示为OCaml值。对于该数组,您肯定可以使用
Ctypes.CArray.element\u type
函数获得大小,例如

let sizeof_element arr = sizeof (CArray.element_type arr)

类型不是值,它没有任何内存中的表示形式。类型仅存在于源代码中,由类型检查器用于静态验证是否存在某些运行时错误。在编译过程中,这些类型将从程序中删除。没有类型的运行时表示,如其他语言如java和C++。p> 所有值在OCaml中都统一表示为立即整数或堆指针。因此,所有值都具有相同的大小,即等于一个机器字的大小。此外,严格来说,值表示是特定于实现的,您不应该直接访问它。OCaml不是C,它负责内存表示(并对其进行抽象)。因此,试图挖掘其内部是一个坏主意

在注释中进行了澄清之后,很明显您所谈论的是来自Ctypes库的数组类型。Ctypes库提供了C语言的接口(双向),并将C类型表示为OCaml值。它们还提供了一个
CArray.t
类型,将C数组表示为OCaml值。对于该数组,您肯定可以使用
Ctypes.CArray.element\u type
函数获得大小,例如

let sizeof_element arr = sizeof (CArray.element_type arr)

我正在寻找的函数应该如下所示:val type:'a array->'a。这不是运行时。我只是希望这个函数可以处理更一般的情况。我很难理解你所说的非运行时函数是什么意思。您在此处给出的函数类型将返回类型为
'A
的值。它不返回类型本身。具有这种类型的函数的一个例子是
让f a=a.(0)
。我正在寻找的函数应该是这样的:val type:'a array->'a。这不是运行时。我只是希望这个函数可以处理更一般的情况。我很难理解你所说的非运行时函数是什么意思。您在此处给出的函数类型将返回类型为
'A
的值。它不返回类型本身。此类型函数的一个示例是
设f a=a.(0)
。谢谢!我正在阅读并尝试示例A。在这个示例中,它确实使用Array.element\u类型。我认为这个函数可能已经过时了,但我们应该有一些替代方法。在这个例子中,OCaml使用C中的qsort函数(我知道OCaml有自己的排序)对数组进行排序。C中的qsort需要元素的大小,这正是我试图解决的问题。啊,现在它非常有意义,您的问题是关于
Ctypes
库和
Ctypes.CArray
。本书中的示例可能使用了一个令人困惑的旧名称
Array
(如您所见)。将所有出现的
Array
替换为
CArray
。谢谢!这本书很好,但需要更新。OCaml是一种快速发展的语言。谢谢!我正在阅读并尝试示例A。在这个示例中,它确实使用Array.element\u类型。我认为这个函数可能已经过时了,但我们应该有一些替代方法。在这个例子中,OCaml使用C中的qsort函数(我知道OCaml有自己的排序)对数组进行排序。C中的qsort需要元素的大小,这正是我试图解决的问题。啊,现在它非常有意义,您的问题是关于
Ctypes
库和
Ctypes.CArray
。书中的例子可能使用了一个旧的