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

Joh*_*oee 18 c++ functional-programming c++11

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

Chr*_*oph 15

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

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

这绝不是一个授权列表,一种语言可以在不提供全部甚至大部分语言的情况下正常运行,但是如果一种语言可以 - 即使它们可以使用而不必跳过主要的箍 - 它们的存在是一个强有力的指标该语言应被视为功能性的.

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

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


Dan*_*her 5

查看C2维基上的函数式编程语言定义和讨论列表.

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

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

  • 如果你必须模仿几乎所有东西,那它就不是一种功能语言 - 它正在模仿一种语言. (18认同)
  • 我们不要忘记"功能"是一种编程风格,而不是语言类型."功能语言"是"一种允许在功能上方便编程的语言"的简写. (11认同)
  • Lambda语法提供了一个很好的语法糖来获得词法闭包,它没有"模仿"这个词所暗示的那么糟糕.通过传递一个仿函数来获得惰性求值,使用lambda语法也更容易. (6认同)
  • 这里的想法是没有明确的功能列表使语言"功能".C++和Python都具有可被描述为功能的特征,以及可被描述为面向对象的特征,以及可被描述为过程的特征.它们都是多范式语言,这可能是描述它们的最佳方式. (2认同)