在C ++中,递归模板和常量值作为模板参数允许执行代码生成和编译时执行的有趣示例,例如factorial。
是否可以使用参数多态,函子或其他概念在OCaml中执行类似的操作?
答案 0 :(得分:3)
ocaml干扰系统使用统一。您可以将其视为计算设备,在这种情况下,它具有逻辑编程的感觉。但是可能性相当受限制,因为这绝不是类型系统的目标之一。正如您将在Jeffrey建议的页面中看到的那样,通过统一的类型级计算实际上相当有限(难以表达,例如乘法)。 Haskell有一个更强大的约束语言,再次对我不确定类型系统中的逻辑编程是一个很好的方法。
OCaml类型系统的另一部分可以在其模块和仿函数语言中进行类型级计算。函数允许以与正式编程语言Fω链接的风格表达类型级计算。您可能可以在模块语言中对类型级别的教堂数字进行编码,但我不知道您可以用此做什么,因为以有用的,可利用的形式检索结果似乎非常困难。特别是,我没有看到如何将该类型信息转换回程序可用的值,如C ++或D那样进行编译时常量计算。
所以,是的,OCaml的类型系统(以及大多数功能语言,也包含SML,Haskell和Scala)具有一定的计算能力,但不,我不希望特别有用< / em>用它们预先计算;并且它当然不是OCaml程序员的标准做法。类型最好被视为类型,它们为它们分类的值带来静态保证。
答案 1 :(得分:2)
你可以在OCaml类型系统中进行算术运算;这是一个非常简单的例子 其他Stackoverflow页面:
我想你可以使用这种机制来计算类型系统中的阶乘。如果你使用标准的一元(Peano)数字编码,一旦数字开始变大,结果就非常可怕。所以这只是一个有趣的特技。
如果你想在类型级别看到真正有趣的计算,你应该看看Haskell。一些常见的扩展(在GHC中可用)允许在类型系统中进行任意计算。即,类型系统是图灵完成。