Boost logo

Boost :

Subject: Re: [boost] painless currying
From: Roman Perepelitsa (roman.perepelitsa_at_[hidden])
Date: 2011-08-24 01:58:22


2011/8/23 Eric Niebler <eric_at_[hidden]>

> 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.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk