【问题标题】:Is it possible to do compile-time execution in OCaml, similar to C++ template metaprogramming?是否可以在 OCaml 中进行编译时执行,类似于 C++ 模板元编程?
【发布时间】:2011-10-07 19:53:00
【问题描述】:

在 C++ 中,作为模板参数的递归模板和常量值允许进行代码生成和编译时执行的有趣示例,例如 factorial

是否可以在 OCaml 中使用参数多态性、仿函数或其他概念做类似的事情?

【问题讨论】:

  • PG'Ocaml (pgocaml.berlios.de) 例如,使用camlp4从数据库中获取类型信息,然后对sql查询进行类型检查。

标签: ocaml template-meta-programming


【解决方案1】:

ocaml 干扰系统使用统一。你可以认为它是一个计算设备,在这种情况下它有一种逻辑编程的感觉。但是可能性相当有限,因为这从来都不是类型系统的目标之一。正如您将在 Jeffrey 建议的页面中看到的那样,通过统一进行的类型级计算实际上是相当有限的(难以表达,例如乘法)。 Haskell 有一个更强大的约束语言,但是我不确定类型系统中的逻辑编程是否是一个好方法。

OCaml 类型系统可以进行类型级计算的另一部分是它的模块和仿函数语言。函子允许以与正式编程语言 Fω 相关联的风格表达类型级计算。您可能可以在模块语言的类型级别上对教堂数字进行编码,但我看不出您可以用它做什么,因为似乎很难以有用的、可利用的形式检索结果。特别是,我不知道如何将类型信息转换回程序可用的值,就像 C++ 或 D 对其编译时常量计算所做的那样。

所以是的,OCaml 的类型系统(以及大多数函数式语言,也适用于 SML、Haskell 和 Scala)具有一定的计算能力,但是不,我不希望这样做特别有用 与它们进行预计算;这当然不是 OCaml 程序员的标准做法。最好将类型视为类型,它为它们分类的值带来静态保证。

【讨论】:

    【解决方案2】:

    您可以在 OCaml 类型系统中进行算术运算;一个非常简单的例子出现在这个 其他 Stackoverflow 页面:

    type level integers in ocaml

    我想你可以使用这种机制来计算类型系统中的阶乘。如果您使用数字的标准一元 (Peano) 编码,一旦数字开始变大,结果就会非常可怕。所以这只是一个有趣的噱头。

    如果你想在类型级别看到真正有趣的计算,你应该看看 Haskell。一些常见的扩展(在 GHC 中可用)允许在类型系统中进行任意计算。即,类型系统是图灵完备的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-13
      • 2010-09-19
      • 1970-01-01
      相关资源
      最近更新 更多