Выражение церковных цифр с помощью Boost.Bind
Церковные цифры можно выразить в C++0x (C++11?), Используя новые лямбда-части языка, используя что-то вроде этого:
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 ответ
Решение
Хорошо, я ничего не знаю о церковных цифрах, и я на самом деле не тестировал этот код, но что-то вроде этого должно работать:)
НТН!
// 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);
}