用Boost.Bind表示教会数字

Expressing Church Numerals with Boost.Bind

本文关键字:教会 数字 表示 Bind Boost      更新时间:2023-10-16

教会数字可以在c++ 0x (c++ 11?)中使用语言的新lambda部分表示,如下所示:

typedef function<int(int)> F;
static const F id = [=](int x) { return x; };
function<F(F)> church(unsigned int i)
{
  if(i == 0) {
    return [=] (F f) { return id; };
  }
  return [=] (F f) {
    F tmp = [=](int x) { return f(church(i-1)(f)(x)); };
    return tmp;
  };
}

是否可以使用Boost来表达教会数字?Bind和c++ 03?如果有,怎么做?

好吧,我对教堂数字一无所知,我也没有实际测试过这段代码,但是像这样的应该工作:)

HTH !

// forward
boost::function<F (F)> church(unsigned int i);
typedef boost::function<int (int)> F;
int idFunc(int x)
{
  return x;
}
static const F id = boost::bind(&idFunc, _1);
F ChurchFunc0(F f)
{
  return id;
}
int ChurchFuncInner(F f, int i, int x)
{
  return f(church(i - 1)(f)(x));
}
F ChurchFunc(F f, int i)
{
  return boost::bind(&ChurchFuncInner, f, i, _1);
}
boost::function<F (F)> church(unsigned int i)
{
  if (i == 0)
  {
    return boost::bind(&ChurchFunc0, _1);
  }
  return boost::bind(&ChurchFunc, _1, i);
}