是c ++模板元编程一种函数式编程

aha*_*ala 11 c++ templates functional-programming

是c ++模板元编程是一种函数式编程吗?如果是的话,为c ++模板元编程相关的非尾递归做一些像stackoverflow这样的陷阱吗?

对于这个问题中的阶乘模板示例,我想这是标准的函数式编程.或者相似性只是肤浅的?

#include <iostream>
using namespace std;

template< int n >
struct factorial { enum { ret = factorial< n - 1 >::ret * n }; };

template<>
struct factorial< 0 > { enum { ret = 1 }; };

int main() {
    cout << "7! = " << factorial< 7 >::ret << endl; // 5040
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Sne*_*tel 7

是c ++模板元编程是一种函数式编程吗?

是的!模板扩展没有副作用,因此它是纯功能的.

如果是的话,为c ++模板元编程相关的非尾递归做一些像stackoverflow这样的陷阱吗?

绝对.Factorial不是一个很好的证明,因为结果会在堆栈运行之前很久就会溢出,但是长递归肯定会导致编译器出错.然而,有趣的是,编译器倾向于以这样的方式实现模板,以便您获得自动memoization.例如,Fibonacci系列的天真编写实现将倾向于在O(n)时间而不是O(2 ^ n)编译.


Tom*_*cek 5

我认为最好的答案是这两个概念完全不同.但是,这并没有什么帮助,所以这里有一些我能想到的关键点:

  • 像ML这样的函数式语言中的C++模板和(参数多态)都是泛型编程的例子,因此在一个问题中一起提及它们是有意义的.在学术界,甚至还有通用编程研讨会,它通常涵盖C++模板和ML风格的函数式编程.

  • 但是,模板元编程为您提供了一种编写在编译C++代码期间"评估"的代码的方法,因此您只能将它用于非常有限的任务.另一方面,功能程序通常在运行时运行,您可以定义复杂的数据结构,构建抽象等(您可以使用模板元编程来做一些事情,但它看起来很难看).

  • 为什么阶乘示例类似于函数式编程中的阶乘?当您使用模板元编程时,您无法定义"可变变量"(因为您只是定义新类型或模板),因此模板元编程可能会感觉有点像函数式编程风格.

  • 使用模板元编程编写的代码在编译时进行评估.这意味着它不能依赖于用户输入!它是编译与否(编译器可能对递归的深度有一些限制,并在一段时间后放弃).另一方面,功能程序可以接受一些输入然后进行评估(这意味着它们可以使用所有可用的堆栈或内存然后失败).

对于函数式程序员,我知道像Agda这样的函数式语言也可以在编译时对事物进行评估,但我认为最好保持简单!

  • 它们不是*完全不同的东西.说实话更接近事实:C++模板元编程是函数式编程.(虽然相反,当然不是真的.) (18认同)
  • 关键点与你的陈述相矛盾:c ++模板元编程和函数式编程不一样,但非常接近.实际上,您可以在Haskell的(子集)中解析函数程序,转换甚至在C++编译期间执行它.例如,请参阅http://abel.web.elte.hu/mpllibs/metaparse/index.html中的库,它可以做到这一点. (4认同)
  • 你们两个都有一些好处,但我仍然会说它们在_high水平上完全不同.在较低的层次上,它们共享一些技术方面(如模板元编程使用功能样式的子集),但如果你想要考虑大局,这并不是真正有用的信息. (2认同)
  • 在基础上,函数式编程是完全由无副作用评估组成的编程,它完美地描述了模板元编程.寻找用户输入等功能是不重要的; 一些函数式语言(例如lambda演算)不接受用户输入. (2认同)