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

时间:2015-02-10 16:51:08

标签: ocaml

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

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

并尝试稍后调用它:

my_func 4 1

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

如果OCaml中没有这样的设施,是否可以与其他现有设施一起实施?

2 个答案:

答案 0 :(得分:1)

截至目前,还没有。

OCaml编译器执行的唯一静态检查是输入(这将使您轻松摆脱可以对和类型执行的许多错误)。通过不断传播,您的测试可以静态转换为立即异常提升,因此也许可以修补编译器在这种情况下打印警告(不是一个简单的补丁恕我直言)。

有一些工具可以帮助您在代码中找到错误,您可以在caml-list上查看that post,引用当前可用的OCaml帮助工具。

答案 1 :(得分:1)

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

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

TEST_MODULE = struct
  let str = "hello\000,\000world\000!\000"
  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