Hi folks, The template "std.functional.curry(alias fun, alias arg)" claims to "curry fun by tying its first argument to a particular value."
That is not currying; it is partial application. In particular, it is a kind of partial application called a "left section," because the argument provided is partially applied as the left-hand argument of the binary function. Partial application takes a binary function and a value, and returns a unary function. Currying takes a binary function and returns a unary function, which returns a unary function. Let [A,B]-> C be the type of binary functions taking arguments of types A and B, and returning a value of type C. A unary function from B to C can be written [B]->C. left section: [ ([A,B]->C), A ] -> ([B] -> C). right section: [ ([A,B]->C), B ] -> ([A] -> C). curry: [ ([A,B]->C) ] -> ([A] -> ([B] -> C)). The example in the std.functional documentation: int fun(int a, int b) { return a + b; } alias curry!(fun, 5) fun5; assert(fun5(6) == 11); If this were a real curry, you would write it like this: int fun(int a, int b) { return a + b; } assert(curry!(fun)(5)(6) == 11); Confusing curring and partial application is a very common mistake. But please rename this template in std.functional. It makes the std.functional module look amateurish to have such an error. I'd vote for "template partial(alias fun, alias arg)" and "template partialR(alias fun, alias arg)" for left and right sections. It's unlikely that you really need a "curry" template at all. Regards, Graham