"fold": a replacement for "reduce"

bearophile bearophileHUGS at lycos.com
Sun Mar 30 14:53:14 PDT 2014


monarch_dodra:

> I'm taking this naming-changing event as an opportunity to 
> "cleanup" reduce too.

This is possibly silly question, or perhaps fit just for D.learn. 
But I think it's sufficiently in topic in this thread.

You have a function foo1 like this:


import std.range, std.algorithm, std.array;

uint[] foo1(uint[][] X) {
     return X.reduce!((i, j) => zip(i, j)
                                .map!(kw => kw[0] | kw[1])
                                .array);
}

void main() {
     import std.stdio;
     uint[][] m1 = [[10, 20], [30, 40]];
     foo1(m1).writeln;
}


foo1 doesn't need to change its input so I'd like to use the 
signature:

int[] foo1(in int[][] X) {

But that can't work because reduce returns a const.

And you can't do this because it returns a wrong result:

uint[] foo2(in uint[][] X) {
     return reduce!((i, j) => zip(i, j)
                              .map!(kw => kw[0] | kw[1])
                              .array)
                   ((uint[]).init, X);
}



This seems OK, but can fold offer a better solution?:

uint[] foo3(in uint[][] X) {
     return reduce!((i, j) => zip(i, j)
                              .map!(kw => kw[0] | kw[1])
                              .array)
                   (X[0].dup, X[1 .. $]);
}

Bye,
bearophile


More information about the Digitalmars-d mailing list