
2011/8/23 Eric Niebler <eric@boostpro.com>
After playing around with functional languages, I've come to envy how easy they make it to curry functions. Call a 2-argument function with 1 argument and you get a function that takes 1 argument. Pass another argument and it evaluates the function. Simple. In contrast, C++ users have to use binders, which are not as nice.
On a lark, I implemented a wrapper that turns any TR1-style function object into a "curryable" function object (attached). Successive function call invocations bind arguments until enough arguments are bound to invoke the wrapped function. With it you can do the following:
curryable<std::plus<int> > p; auto curried = p(1); int i = curried(2); assert(i == 3);
Is there any interest in such a thing?
I think it's a very useful thing to have! curryable should probably be renamed to curried (this is the term http://en.wikipedia.org/wiki/Currying uses). A generator for curried objects named curry would be a nice addition too, as would be the reverse - uncurry. By the way, don't you need to manually pass arity in the general case? What if the underlying functor is callable with one argument, but also with two? I think this is the case with functors generated by bind -- they appear to be callable with any number of arguments. FWIW, Egg<http://p-stade.sourceforge.net/egg/doc/html/egg/function_adaptors.html>has curryN (where N is a number literal) and uncurry. Roman Perepelitsa.