C ++ 0x(C ++ 11)作为函数式语言?

时间:2011-01-31 18:51:00

标签: c++ c++11 functional-programming

我想知道C ++ 0x(C ++ 11)(带有lambdas和完美转发)是否是函数式语言的超集。 是否存在C ++没有的函数式语言的任何特性?

2 个答案:

答案 0 :(得分:15)

函数式编程范式将计算模型化为集合之间的关系,因此具有内在的声明性。但是,在实践中,我们经常将函数视为命令式,即您输入一个输入值并输出一个输出值,与过程相同。从这个观点来看,函数的特征性质是它没有副作用。由于术语含糊不清,我们称这样的函数为 pure ,而只有纯函数的语言将是纯函数语言。

然而,并非所有函数式语言都是纯粹的:函数式语言是一种语法和语义的语言,它允许程序员有效地使用函数式范例。使用范例可行的一些概念包括 - 除其他外 - 具有词法闭包的lambda表达式,高阶函数,变体类型和模式匹配,惰性求值,类型推断(在静态类型语言的情况下)。

这绝不是一个授权列表,语言可以很好地发挥作用而不提供全部甚至大部分,但如果一种语言 - 即使它们可以使用而不必跳过主要的箍 - 他们的存在是一个强有力的指标,表明语言应该被认为是有效的。

我不太了解Boost来决定C ++ 03 + Boost是否是一种可行的函数式语言,但是C ++ 0x肯定会让C ++ 更多更具功能性,甚至推动它在功能语言领域的主观边界上。

顺便说一下,同样的考虑适用于其他编程范例:C ++也不是一种纯粹的面向对象的语言(事实上,设计一种既纯粹功能又纯粹是对象的语言,实际上甚至在理论上也是不可能的-oriented),大多数通常与OO语言(类,继承,封装)相关联的功能实际上也不具备授权......

答案 1 :(得分:5)

查看C2维基上的Functional Programming Languages定义和讨论列表。

一些最常见(也是最少争议的功能)是:

  • 第一类函数 - function类表示第一类函数。
  • 高阶函数 - 可以使用函数对象进行模拟。
  • Lexical Closures - 可以使用类进行模拟。
  • 单一作业 - 更多约定。您可以通过声明所有变量const
  • 来执行此操作
  • 懒惰评估 - 可以通过TMP实现
  • 垃圾收集 - 仍然缺失。在功能语言中非常必要,因为生命周期和范围相同,正如@Pascal在上面的评论中指出的那样。
  • 类型推断 - auto
  • 尾部调用优化 - 对于函数式语言不是必需的,但是依赖于C ++的编译器。