types - OCaml 中的依赖类型

标签 types ocaml

Haskell 和 Scala 中有很多关于依赖类型的信息。对于 OCaml,不是那么多。有没有足够熟练的人提供一个关于如何在 OCaml 中实现这一点的编码示例(如果可能的话)?当然有(废弃的)Dependent ML ,但似乎不可能在“常规” OCaml 代码中合并这些东西。

基本上,我想要做的是删除像 assert(n > 0) 这样的代码并在编译时检查它。

编辑

作为旁注,值得一提的是 OCaml Hybrid Contract Checking分支,这可以满足依赖类型系统的一些需求。而不是 assert(n > 0)然后你会写一个契约(Contract):

contract f = {x : x > 0} -> int
let f x = x + 1
let dummy_variable = f (-1) (* Won't compile *)

编辑 2 :对于阅读本文的任何人,我认为 F* 是一种有趣的类似 ML 的语言,具有依赖类型。

最佳答案

引用链接是 Oleg 的 lightweight dependent typing 页面,其中包含 ML 语言中使用的类似相关技术的示例(在 OCaml 中或您可以转换为 OCaml)。他在 2007 年与 Chung-chieh Shan 的关于 Lighweight static capabilities (PDF) 的论文尤其相关。

编辑:自 4.00 版(在编写上述文档后发布)以来,OCaml 具有 GADT,它允许简化一些用于精炼静态信息的技术(以前依赖于幻像类型技术),特别是 Omega 中演示的“单例类型”模式.已经表明,它们不是获得强类型编程所必需的,但它们仍可能被广泛使用的各种示例所使用。

关于types - OCaml 中的依赖类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15693838/

相关文章:

android - 如何在 Kotlin 中初始化未知类型的属性?

python - Python 等语言如何克服 C 的 Integral 数据限制?

compiler-errors - 接口(interface)上的假设不一致(Ocaml)

types - OCaml 在不相交的联合中有记录语法吗?

ocaml - 为什么这个 OCaml 代码收到 "Unexpected token"?

naming-conventions - Ocaml 命名约定

c# - 可以从 ASP .net 访问哪些 C# 类型?

c++ - boost::serialization Archive::register_type 如何工作?

ocaml - Ocaml 如何决定用户定义运算符的优先级?

haskell - 推断 lambda 表达式的类型