Выражение церковных чисел с помощью Boost.Bind - PullRequest
2 голосов
/ 01 сентября 2011

Церковные цифры можно выразить в C ++ 0x (C ++ 11?), Используя новые лямбда-части языка, используя что-то вроде this :

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? Если да, то как?

1 Ответ

0 голосов
/ 02 сентября 2011

Хорошо, я ничего не знаю о церковных цифрах, и я на самом деле не тестировал этот код, но что-то вроде этого должно работать:)

НТН!

// 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);
}
...