这是关于这个问题的后续问题:Lambda-Over-Lambda in C++14 ,其中的答案解释了代码。
它是关于创建另一个 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,"Hello\n"); return s; };
auto world =[](auto s){ fprintf(s,"World\n"); return s; };
terminal(stdout)
(hello)
(world) ;
return 0;
}
这个结构是否已经有了名称,如果没有,应该叫什么? 它是否类似于其他语言中的结构?
备注:到底有没有用,我不感兴趣。
最佳答案
我环顾四周,发现主要功能是重新排序函数调用,如 answers 中所述。到原来的问题。
所以 world(hello(stdout));
重写为 terminal(stdout)(hello)(world);
更一般地可以写成 compose(stdout)(hello)(world);
.
- 在 Haskell 中,这将写为
world . hello $ stdout
并称为 function composition . - 在 clojure 中它将是 (-> stdout hello world) 并且被称为 the "thread-first" macro
我认为它只对 lambda 提供了一点点的体面的部分应用程序有用,所以我们可以有 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,因此 this answer 中的构造可能更适合(用逗号而不是括号分隔函数)。
关于c++ - 这个似乎链接 lambda 的 C++14 结构叫什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25619769/