Search code examples
c++bindy-combinator

Fixed point combinators in C++


I'm interested in actual examples of using fixed point combinators (such as the y-combinator in C++. Have you ever used a fixed point combinator with egg or bind in real live code?

I found this example in egg a little dense:

void egg_example()
{
    using bll::_1;
    using bll::_2;

    int r =
        fix2(
            bll::ret<int>(
                // \(f,a) -> a == 0 ? 1 : a * f(a-1)
                bll::if_then_else_return( _2 == 0,
                    1,
                    _2 * lazy(_1)(_2 - 1)
                )
            )
        ) (5);

    BOOST_CHECK(r == 5*4*3*2*1);
}

Can you explain how this all works?

Is there a nice simple example perhaps using bind with perhaps fewer dependancies than this one?


Solution

  • Here is the same code converted into boost::bind notice the y-combinator and its application site in the main function. I hope this helps.

    #include <boost/function.hpp>
    #include <boost/bind.hpp>
    #include <iostream>
    
    // Y-combinator compatible factorial
    int fact(boost::function<int(int)> f,int v)
    {
      if(v == 0)
        return 1;
      else
        return v * f(v -1);
    }
    
    // Y-combinator for the int type
    boost::function<int(int)>
        y(boost::function<int(boost::function<int(int)>,int)> f)
    {
      return boost::bind(f,boost::bind(&y,f),_1);
    }
    
    
    int main(int argc,char** argv)
    {
      boost::function<int(int)> factorial = y(fact);
      std::cout << factorial(5) << std::endl;
      return 0;
    }