2

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

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

4

2 回答 2

3

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

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

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

于 2011-10-08T16:40:38.890 回答
2

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

ocaml 中的类型级别整数

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

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

于 2011-10-08T01:21:10.870 回答