OCaml 中的静态(编译时)断言?

Static (compile-time) assert in OCaml?

OCaml 中是否有这样的工具(例如,类似于 C++ 和 D)?
例如,当我定义函数时:

let my_func arg1 arg2 =
    static_assert (arg1 < arg2);
    (* rest of the function's body *)  

稍后尝试这样调用它:

my_func 4 1

我会在编译时断言失败吗?

如果 OCaml 中没有这样的工具,是否可以使用其他现有工具来实现它?

目前还没有。

OCaml 编译器完成的唯一静态检查是类型检查(这将允许您轻松摆脱很多在 sum 类型上可能犯的错误)。通过不断传播,您的测试可以静态地转换为立即引发异常,因此也许可以修补编译器以在这种情况下打印警告(恕我直言,这不是一个简单的修补程序)。

虽然有一些工具可以帮助您查找代码中的错误,但您可以查看 caml-list 上的 that post,参考当前可用的 OCaml 帮助工具。

静态断言来自您所指定语言的类型系统的缺陷。 OCaml 已经检查了所有可能用其类型系统表达的东西。如果某些东西可以在编译时被证明是不可靠的,OCaml 会说明这一点。

但是,在 OCaml 中您仍然可以添加一些检查,这不会影响 运行时间,但可以让您验证额外的属性和不变量,这些属性和不变量不是静态验证的。 Janestreet 提供了一个 pa_test 库,允许您将测试内联到您的模块中,并 运行 它们作为编译过程的一部分。不是真正的静态断言,但仍在编译时(至少从观察者的角度来看)。看起来像这样:

TEST_MODULE = struct
  let str = "hello[=10=]0,[=10=]0world[=10=]0![=10=]0"
  let pos_ref = ref 0
  TEST = read_cstring str ~pos_ref = Ok "hello"
  TEST = read_cstring str ~pos_ref = Ok ","
  TEST = read_cstring str ~pos_ref = Ok "world"
  TEST = read_cstring str ~pos_ref = Ok "!"
  TEST = String.length str = pos_ref.contents
end