这是对此问题的后续问题:C++14 中的 Lambda 之上的 Lambda https://stackoverflow.com/questions/25618934/lambda-over-lambda-in-c14,其中答案解释了代码。
它是关于一个 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,"Hello\n"); return s; };
auto world =[](auto s){ fprintf(s,"World\n"); return s; };
terminal(stdout)
(hello)
(world) ;
return 0;
}
这个构造是否已经有一个名称了?如果没有,应该叫什么名字?
它类似于其他语言中的结构吗?
备注:我对它是否真的有用不感兴趣。
我环顾四周,发现主要功能是重新排序函数调用,如answers https://stackoverflow.com/a/25619574/104774到原来的问题。
So world(hello(stdout));
被重写为terminal(stdout)(hello)(world);
更一般地可以写成compose(stdout)(hello)(world);
.
- 在 Haskell 中这会写成
world . hello $ stdout
并被称为功能组合 http://www.haskell.org/haskellwiki/Function_composition.
- 在 clojure 中它将是 (-> stdout hello world) 并被称为“线程优先”宏 http://clojuredocs.org/clojure_core/clojure.core/-%3E
我认为它只对 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,因此中的构造这个答案 https://stackoverflow.com/a/19071426/104774可能更适合(函数用逗号而不是括号分隔)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)