Зависимые типы в OCaml

Там много информации об зависимых типах в Haskell и Scala. Для OCaml не так много. Является ли кто-либо достаточно квалифицированным, чтобы представить пример кодирования того, как достичь этого в OCaml (если это вообще возможно)? Конечно, есть (заброшенный) Dependent ML, но, похоже, невозможно включить такой материал в "обычный" OCaml-код.

В принципе, я хочу удалить код, например assert(n > 0), и проверить его во время компиляции.

ИЗМЕНИТЬ

В качестве примечания следует упомянуть подразделение OCaml Гибридная проверка контрактов, которая может заполнить некоторые из потребностей системы зависимого типа. Вместо assert(n > 0) вы должны написать контракт:

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

Ответ 1

Ссылка на ссылку - это страницы облегченные зависимости от ввода, примеры (в OCaml или вы можете перевести на OCaml) зависимых методов, используемых на языках ML. Его статья о Взвешивающие статические возможности (PDF) с Chung-chieh Shan в 2007 году особенно важны.

Изменить: поскольку версия 4.00 (выпущена после того, как был написан вышеприведенный документ), OCaml имеет GADT, которые позволяют оптимизировать несколько методов для уточненной статической информации (ранее полагаясь на методы типа phantom), в частности, "одноэлементные типы" ", продемонстрированный в Omega. Было показано, что они не имеют существенного значения для сильного программируемого программирования, но они все еще могут использоваться множеством примеров, найденных в дикой природе.