"fold": a replacement for "reduce"

Meta jared771 at gmail.com
Thu Mar 27 11:04:13 PDT 2014


On Thursday, 27 March 2014 at 17:30:58 UTC, Simen Kjærås wrote:
> Ah, true. Call it an enhancement request, then. Wanting to 
> alias a function literal like that is so common the language 
> should support it.
>
> --
>   Simen

It's a bit unintuitive as to what works and what doesn't 
(although it makes sense for the most part).

//No good
alias fun = a => a + 1;
alias fun = (int a) => a + 1;
//Ok
alias fun = unaryFun!(a => a + 1);
alias fun = unaryFun!((int a) => a + 1);

//Doesn't work
enum fun = a => a + 1;
enum fun = unaryFun!(a => a + 1);
//Works
enum fun = (int a) => a + 1;
enum fun = unaryFun!((int a) => a + 1);


But the fun is just beginning. Now we can mix in template aliases 
and enums.

//Chokes
alias fun() = a => a + 1;
alias fun() = (a => a + 1);
alias fun() = (int a) => a + 1;
alias fun(T) = a => a + 1;
alias fun(T) = (a => a + 1);
alias fun(T) = (int a) => a + 1;

//Fine
alias fun() = unaryFun!(a => a + 1);

//Compiles but fails when fun is called
alias fun() = unaryFun!((int a) => a + 1);
fun(1); //undefined reference to 
`_D4f2924mainFZv8__T3funZ9__lambda2FNaNbNfiZi'

enum fun() = unaryFun!(a => a + 1);
fun(1); //cannot infer type from template template __lambda2

enum fun() = unaryFun!((int a) => a + 1);
fun(1); //cannot deduce function from argument types !()(int)

enum fun() = a => a + 1;
fun(1); //type void is inferred from initializer a => a + 1

enum fun() = (int a) => a + 1;
fun(1); //cannot deduce function from argument types !()(int)


So there you have it.






More information about the Digitalmars-d mailing list