OCaml编译器检查向量长度

OCaml编译器检查向量长度,ocaml,Ocaml,我想知道是否可以在OCaml中进行编译时检查,以确保数组的长度正确。对于我的问题,我想在执行分段向量减法之前验证两个GPU一维向量的长度是否相同 let init_value = 1 let length = 10_000_000 let x = GpuVector.create length init_value and y = GpuVector.create 9 init_value in let z = GpuVector.sub v1 v2 在这个例子中,我希望它抛出一个编译错误,因

我想知道是否可以在OCaml中进行编译时检查,以确保数组的长度正确。对于我的问题,我想在执行分段向量减法之前验证两个GPU一维向量的长度是否相同

let init_value = 1
let length = 10_000_000
let x = GpuVector.create length init_value and y = GpuVector.create 9 init_value in
let z = GpuVector.sub v1 v2

在这个例子中,我希望它抛出一个编译错误,因为x和y的长度不同。因为我是一个OCaml noob,我想知道我如何才能做到这一点?我猜我将不得不使用函子或camlp4(我以前从未使用过)

您不能在OCaml中为长度为n的
数组定义类型族,其中
n
可以具有任意长度。但是,可以使用其他机制来确保只使用长度兼容的
GpuVector.sub
数组

最容易实现的机制是为长度为9的
GpuVector
定义一个特殊模块,您可以使用函子对9进行泛化。下面是模块
GpuVectorFixedLength
的示例实现:

module GpuVectorFixedLength =
struct
module type P =
sig
  val length : int
end

module type S =
sig
  type t
  val length : int
  val create : int -> t
  val sub : t -> t -> t
end

module Make(Parameter:P): S =
struct
  type t = GpuVector.t
  let length = Parameter.length
  let create x = GpuVector.create length x
  let sub = GpuVector.sub
end
end
例如,你可以这样说

module GpuVectorHuge = GpuVectorFixedLength.Make(struct let length = 10_000_000 end)
module GpuVectorTiny = GpuVectorFixedLength.Make(struct let length = 9 end)
let x = GpuVectorHuge.create 1
let y = GpuVectorTiny.create 1
z
的定义随后被编译器拒绝:

let z = GpuVector.sub x y
                        ^
Error: This expression has type GpuVectorHuge.t
       but an expression was expected of type int array
因此,我们成功地在类型系统中反映了具有相同长度的两个数组的属性。您可以利用模块包含快速实现完整的
GpuVectorFixedLength.Make
functor。

库实现此类大小静态检查(用于线性代数)。
总体方法如下所述

OCaml本身没有依赖类型,可用于静态检查数组长度不匹配。您可以做的一件事是使用幻影类型,它携带幻影编码数组长度。这些编码可以使用CamlP4从整数常量自动生成。。。但这不是依赖类型,可能不足以满足您的需要。@camlspotter我刚找到您的评论。我也有类似的问题。你能提供一些关于将自然数编码为类型的提示/指针吗?@krokodil,现在你可以试试slap,正如Pierre在回答中指出的那样;你知道现在在哪里可以找到它吗?这不完全是原始的摘要,但我认为这更完整