这个C++14构造被称为什么,它似乎链接了lambdas

What is this C++14 construct called which seems to chain lambdas?

本文关键字:链接 lambdas 为什么 C++14 这个      更新时间:2023-10-16

这是关于这个问题的后续问题:C++14中的Lambda Over Lambda,其中的答案解释了代码。

它是关于一个创建另一个lambda的lambda,该lambda在被调用时调用传递的lambda并将返回值传递给原始lambda,从而返回第二个lambda的新实例。

该示例显示了如何以这种方式链接Lambda。

复制自原始问题:

#include <cstdio>
auto terminal = [](auto term)            // <---------+  
{                                        //           |
    return [=] (auto func)               //           |  ???
    {                                    //           |
        return terminal(func(term));     // >---------+
    };
};

auto main() -> int
{
    auto hello =[](auto s){ fprintf(s,"Hellon"); return s; };
    auto world =[](auto s){ fprintf(s,"Worldn"); return s; };

    terminal(stdout)
            (hello)
            (world) ;
    return 0;
}

这个构造是否已经有了名称?如果没有,应该调用什么?它类似于其他语言中的结构吗

备注:我对它是否真的有用不感兴趣。

我环顾四周,发现主要功能是重新排序函数调用,如原始问题的答案中所述。

因此CCD_ 1被重写为CCD_ 2,CCD_。

  • 在Haskell中,这将被写成world . hello $ stdout,并被称为函数组合
  • 在clojure中,它将是(->stdout-hellow-world),并被称为"线程优先"宏

我认为它只对lambdas提供的体面的部分应用程序有用,所以如果我的计算(和盲编码)很好,我们可以有compose(4)([](int x){ return x + 7; })([](int x){ return x * 2; })([](int x){ return x == 22; });,它应该返回true。

或强调部分应用:

auto add7 = [](int x){ return x + 7; };
auto dbl = [](int x){ return x * 2; };
auto equal22 = [](int x){ return x == 22; };
assert(compose(4)(add7)(dbl)(equals22));

这个实现的一个主要问题可能是无法计算结果,因为最后返回了lambda,所以这个答案中的构造可能更适合(用逗号而不是括号分隔函数)。

terminal(x)返回一个应用程序,该方法将其返回值链接到terminal中以进行重复调用。

但我们可以把它推广开来

假设您有一个函数FF接受一个参数,并将其填充到堆栈中。

然后它检查堆栈。如果在堆栈的某个子集上计算的堆栈顶部可以进行调用,它就会执行调用,并将结果推回到堆栈上。通常,这样的调用可以返回一个结果元组。

因此:

F(3)(2)(add)(2)(subtract)(7)(3)(multiply)(power)

将评估为:

((3+2)-2)^(7*3)

world(hello(stdout));0使用0个参数函数(第一个参数)和1个参数函数,并且每次调用只支持1个返回值。

用lambda做这件事会很棘手,但我所描述的在C++中是可行的。

因此,它的一个名称是基于堆栈的编程。

据我所知,目前还没有"官方"名称。

建议:

  • Lambda链
  • Lambda香肠
  • 咖喱香肠