Можно ли выполнить выполнение во время компиляции в OCaml, аналогично метапрограммированию шаблонов C ++? - PullRequest
2 голосов
/ 07 октября 2011

В C ++ рекурсивные шаблоны и постоянные значения в качестве параметров шаблона позволяют создавать интересные примеры генерации кода и выполнения во время компиляции, такие как factorial .

Можно ли делать подобные вещи в OCaml, используя параметрический полиморфизм, функторы или другие понятия?

Ответы [ 2 ]

3 голосов
/ 08 октября 2011

Система взаимодействия ocaml использует унификацию. Вы можете считать это вычислительным устройством, и в этом случае у него есть чувство логического программирования. Но возможности довольно ограничены, поскольку это никогда не было одной из целей системы типов. Как вы увидите на странице, предложенной Джеффри, вычисления на уровне типов посредством объединения на самом деле довольно ограничены (трудно выразить, например, умножение). У Haskell есть более мощный язык ограничений, но опять же, я не уверен, что логическое программирование в системе типов - хороший способ.

Другая часть системы типов OCaml может выполнять вычисления на уровне типов в своем модуле и языке функторов. Функторы позволяют выражать вычисления на уровне типов в разновидности, связанной с формальным языком программирования Fω. Возможно, вы могли бы кодировать церковные цифры на уровне типов в языке модуля, но я не вижу, что вы могли бы сделать с этим, так как кажется, что довольно трудно получить результаты в полезной, пригодной для использования форме. В частности, я не понимаю, как превратить информацию о типе обратно в значения, используемые вашей программой, как это делают C ++ или D с помощью вычисления констант во время компиляции.

Так что да, система типов OCaml (и наиболее функциональный язык, который будет содержать SML, Haskell и Scala) также обладает некоторой вычислительной мощью, но нет, я бы не ожидал, что она будет особенно полезной предварительный расчет с ними; и это, конечно, не стандартная практика среди программистов OCaml. Типы лучше всего рассматривать как типы, которые дают статические гарантии относительно значений, которые они классифицируют.

2 голосов
/ 08 октября 2011

Вы можете делать арифметику в системе типов OCaml;на этой другой странице Stackoverflow появляется очень простой пример:

целочисленные значения уровня типа в ocaml

Я думаю, вы могли бы использовать этот механизм для вычисления факториаловв системе типов.Если вы используете стандартную унарную (Peano) кодировку чисел, результаты будут довольно ужасными, когда числа начнут становиться большими.Так что это был бы просто интересный трюк.

Если вы хотите увидеть действительно интересные вычисления на уровне типов, вам стоит взглянуть на Haskell.Некоторые распространенные расширения (доступные в GHC) допускают произвольные вычисления в системе типов.То есть система типов завершена по Тьюрингу.

...