这个C++14构造被称为什么,它似乎链接了lambdas
What is this C++14 construct called which seems to chain lambdas?
这是关于这个问题的后续问题: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
中以进行重复调用。
但我们可以把它推广开来
假设您有一个函数F
。F
接受一个参数,并将其填充到堆栈中。
然后它检查堆栈。如果在堆栈的某个子集上计算的堆栈顶部可以进行调用,它就会执行调用,并将结果推回到堆栈上。通常,这样的调用可以返回一个结果元组。
因此:
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香肠
- 咖喱香肠
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 基于boost的程序的静态链接——zlib问题
- 无法链接 CMake 中的本地库
- 内联函数中具有内部链接的全局变量
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 使用gcc从静态链接的文件中查找可选符号
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 下面是我为检测链接列表中的循环而制作的代码
- 有了gcc,是否可以链接库,但前提是它存在
- 使用C链接在函数内部创建C++模板
- Visual Studio mkl_link_tool.exe链接错误
- 用boost.asio链接异步lambdas
- 这个C++14构造被称为什么,它似乎链接了lambdas