在Haskell和Scala中有很多关于依赖类型的信息。对于OCaml,没有那么多。是否有足够的技术人员提供有关如何在OCaml中实现此目的的编码示例(如果可能的话)?当然(已废弃的)Dependent ML,但似乎无法将这些内容合并到“常规”OCaml代码中。
基本上,我想要删除assert(n > 0)
之类的代码并在编译时检查它。
修改
作为旁注,值得一提的是OCaml Hybrid Contract Checking分支,它可以满足依赖类型系统的一些需求。而不是assert(n > 0)
你会写一份合同:
contract f = {x : x > 0} -> int
let f x = x + 1
let dummy_variable = f (-1) (* Won't compile *)
编辑2 :对于读这篇文章的人来说,我认为F *是一种有趣的类ML语言,具有依赖类型。
答案 0 :(得分:12)
参考链接是Oleg的lightweight dependent typing页面,其中包含ML语言中使用的依赖类技术的示例(在OCaml中或可以转换为OCaml)。他在2007年与Chung-chieh Shan Lighweight static capabilities (PDF)的论文特别相关。
编辑:自版本4.00(在上面的文档编写之后发布),OCaml有GADT,它允许精简一些技术以获得精细的静态信息(以前依赖于幻像类型技术),特别是“单例类型”模式在Omega中展示。已经证明它们对于获得强大的类型编程并不是必不可少的,但它们仍然可以被野外发现的各种例子使用。