使用C+的纯函数式编程+; 我相信C++中的新特性确实允许程序员在这种巨大的语言中进行纯函数编程。我尝试了下面的一个,完全没有变量,循环只基于递归,作为纯函数。我想知道在用C++做这件事是否有一些实际的好处。那么,C++比任何其他函数语言都

使用C+的纯函数式编程+; 我相信C++中的新特性确实允许程序员在这种巨大的语言中进行纯函数编程。我尝试了下面的一个,完全没有变量,循环只基于递归,作为纯函数。我想知道在用C++做这件事是否有一些实际的好处。那么,C++比任何其他函数语言都,c++,functional-programming,C++,Functional Programming,使用C+的纯函数式编程+; 我相信C++中的新特性确实允许程序员在这种巨大的语言中进行纯函数编程。我尝试了下面的一个,完全没有变量,循环只基于递归,作为纯函数。我想知道在用C++做这件事是否有一些实际的好处。那么,C++比任何其他函数语言都快,这样,尽管它对程序员来说可能相当令人头痛,但它直接降低了函数编程范式的所有好处和安全性。或者,当前的C++编译器太笨了,无法有效地优化这样的代码? #include <iostream> #include <functio

使用C+的纯函数式编程+; <>我相信C++中的新特性确实允许程序员在这种巨大的语言中进行纯函数编程。我尝试了下面的一个,完全没有变量,循环只基于递归,作为纯函数。我想知道在用C++做这件事是否有一些实际的好处。那么,C++比任何其他函数语言都快,这样,尽管它对程序员来说可能相当令人头痛,但它直接降低了函数编程范式的所有好处和安全性。或者,当前的C++编译器太笨了,无法有效地优化这样的代码?

#include <iostream>
#include <functional>
#include <cstdint>

int main() {
    std::function<const uint64_t (const uint64_t)> factorial = [&](const uint64_t n)
    -> const uint64_t {
        if (n == 0) {
            return 1;
        }
        return n * factorial(n - 1);
    };
    {
        enum { NUM_ITERATION = 20 };
        std::function<void (const unsigned)> loop = [&](const unsigned n) -> void {
            if (n == 0) {
                return;
            }
            std::cout << factorial(NUM_ITERATION - n) << '\n';
            loop(n - 1);
        };
        loop(NUM_ITERATION);
    }
    return 0;
}
#包括
#包括
#包括
int main(){
std::函数阶乘=[&](const uint64\u t n)
->const uint64\u t{
如果(n==0){
返回1;
}
返回n*阶乘(n-1);
};
{
枚举{NUM_迭代=20};
std::function loop=[&](const unsigned n)->void{
如果(n==0){
返回;
}

STD::你应该检查编译器的输出(优化启用)来形成自己的视图,否则你会得到模糊的泛化和猜测。一些和可能所有的正规C++编译器都能在原理上进行尾调用优化,但是我从来没有检查过使用<代码> STD::函数< /> >阻碍了这一点。(例如,编译器是否会费心去确定没有任何东西分配给
循环
其他地方?)虽然代码的> >代码>尾部递归可能是C++编译器之外的,但是我很乐意在这方面出错。参见C++ > CONTXPRP</代码>。在C++中进行函数编程就像用一个千斤顶组装手表。(即使是最好的编译器也只能在非常有限的情况下完成)其他相关的优化,缺少数据类型,以及完全不完善的语法——仅举几个原因——对于简单模式的任何东西都是禁止的。嗯,C++可以比其他函数编程语言更快,但是记住C++编译器通常在命令式编译器的同时优化功能性编译器的编译器。夯实语言致力于优化功能程序(并利用了该领域的所有几十年的研究成果),因此这里可能不一定是这样的。在C++中,有些功能优化是不可能的(例如流融合)。因为你不能保证某事物没有副作用。而且C++语法不太适合纯函数代码。编译器在你的例子中生成了许多隐藏类,即“纯函数”。范式不是最佳的,而是一个功能范例。你应该做的是从纯XXX范式中移开,接受C++的原样:一个使用所有范式的最佳特征的多范式语言。STD::函数和lambdas生成不必要的对象,通过用C++做实际有用的东西,可以优化这些不必要的对象。