# Boost :

Subject: Re: [boost] phoenix::bind
From: Peter Dimov (pdimov_at_[hidden])
Date: 2008-10-02 11:50:57

Joel de Guzman:

> std::cout << "Double Square of " << 5 << " is " <<
> ffx(lambda[sqr(_1)], 5.0)()
> << std::endl;

This is not quite what I was after. As I understood your original problem,
we are looking for a construct lflx such that:

lflx( f )

yields a function ffx such that

ffx( x )

yields f( f( x ) ).

In other words, we want

lflx( sqr )( 5.0 ) to give us sqr(sqr(5.0)).

(The case where f and x are given at the same time is so easy that even
boost::bind can do it.)

I was also trying to express this double lambda lflx as a Phoenix
expression:

auto lflx = <phoenix expression here>;

My original attempt:

lambda( _f = _1 )[ bind( _f, bind( _f, _1 ) ) ]

made sense to me, and I still don't understand why it doesn't work.

Maybe if we start from something simpler I'd be able to find my error. What
is the Phoenix way to take a binary function f( x, y ) and construct an
unary function lxly for which lxly( x ) returns a unary function ly such
that ly( y ) returns f( x, y )? (Classic curry, in other words.) I'd have
expected

lambda( _x = _1 )[ bind( f, _x, _1 ) ]