2011-09-01 64 views
2

Church數可以在C++ 0x中表示使用該語言的新拉姆達部分使用類似this(C++ 11):表達Church數與Boost.Bind

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來表達教會的數字?如果是這樣,怎麼樣?

回答

0

好吧,我不知道Church數什麼,我還沒有實際測試此代碼,但這樣的事情應該工作 :)

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); 
} 
+0

這有助於很多,謝謝! – PaulH