【问题标题】:Boost Lambda/Phoenix - how to do lambda which returns another lambda?Boost Lambda/Phoenix - 如何执行返回另一个 lambda 的 lambda?
【发布时间】:2013-02-11 04:42:05
【问题描述】:

Boost Lambda/Phoenix 是否支持开箱即用的东西,比如返回另一个 lambda 的 lambda?

例如,可以用来做某种柯里化:

std::cout << [](int x){return [=](int y){return x+y;};}(1)(2);

如何使用 Boost Lambda/Phoenix 实现类似的目的(+ 作为奖励 - 我们将获得多态行为)?

【问题讨论】:

  • 我试图回答这个问题时遇到的问题是arg1 被最外层的bind 消耗——我想要一个arg1 我可以传递给内部的bind,但是外部bind 吃掉它。如果我有办法“逃避”参数占位符......
  • @Yakk,您可以尝试使用 boost::bind - AFAIK 它不同于 lambda/phoenix 绑定(boost.org/doc/libs/1_53_0/doc/html/lambda/s08.html#idp111396608)。另外,发布您尝试的代码作为答案 - 赏金将于明天结束......

标签: c++ boost lambda functional-programming currying


【解决方案1】:

Boost Phoenix Scope: let/lambda

Live demo:

#include <boost/phoenix.hpp>
#include <iostream>
#include <ostream>

using namespace std;
using namespace boost;
using namespace phoenix;
using namespace arg_names;
using namespace local_names;

int main()
{
   // capture by reference:
   cout <<
      (lambda(_a=_1)[_1 + _a ])(1)(2)
   << endl;
   cout <<
      (lambda(_b=_1)[lambda(_a=_1)[_1 + _a + _b ]])(1)(2)(3)
   << endl;
   // capture by value:
   cout <<
      (lambda(_a=val(_1))[_1 + _a ])(1)(2)
   << endl;
   cout <<
      (lambda(_b=val(_1))[lambda(_a=val(_1))[_1 + _a + _b ]])(1)(2)(3)
   << endl;
}

输出是:

3
6
3
6

【讨论】:

  • @EvgenyPanasyuk 有没有一种简单的方法来生成惰性评估,例如[&amp;]()-&gt;void{ fully_bound_expression_that_does_not_run_until_later; }
  • @Yakk,您能否详细描述一下您的意思(也许通过 C++11 lambdas 的完整示例)?你的意思是liveworkspace.org/code/30jCv6$0 吗?或者liveworkspace.org/code/2Kon3g$0
  • void some_function(int x); auto lazy_do_on_x = [](int x){return [=]{some_function(x);};}; auto lazy_do = lazy_do_on_x(5); lazy_do(); -- 当我天真地尝试使用bind 时,当每个参数都被绑定时,它会计算表达式。相反,我想懒惰地bind,所以最终执行只发生在我评估(使用()bind 的无效结果之后。
  • @Yakk,std::bind 确实返回空函数:auto lazy=bind(some_function,11);懒惰的(); liveworkspace.org/code/2BLbzn$0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 2015-01-08
  • 2022-10-14
  • 2020-11-06
相关资源
最近更新 更多