Staging
The three projections of Dr. Futamura
http://blog.sigfpe.com/2009/05/three-projections-of-doctor-futamura.html. Consider this a great read.
Partial evaluation is great when there isn’t a single fixed order in
which to universally expect your parameters to arrive. Consider a
classic example, the power(x,n) function. Depending what you’re
expecting, you might get either the base first or the exponent
first. Either could be useful. So there isn’t a /single/ uniform
/best/ way to curry the function out.
Staging
Sometimes we can expect a best way to describe the inputs. An order in
which it always makes sense. Then we can manually /stage/ that
program, rather taking in all of these parameters, we can separate it
out into multiple functions. This is nothing more than taking a
function h, and separating it out into a composition of two
different functions g ∘ f so that g never refers to or calls,
directly or indirectly, f.
After naively staging, we can do some optimization, execute some additional work in earlier stages to make the final stage more efficient.