Am Sat, 28 Dec 2013 01:54:26 +0000 schrieb "John Colvin" <john.loughran.col...@gmail.com>:
> On Saturday, 28 December 2013 at 01:41:35 UTC, David Held wrote: > > import std.algorithm; > > import std.stdio; > > import std.conv; > > > > class Trivial > > { > > int sideEffect() { return n++; } > > override string toString() pure { return to!string(n); } > > int n; > > } > > > > void main() > > { > > Trivial[] objs = [ new Trivial ]; > > map!(o => o.sideEffect())(objs); > > writeln(objs); // [0] > > foreach (o; objs) o.sideEffect(); > > writeln(objs); // [1] > > } > > > > Can someone explain to me why map() is not equivalent to > > foreach in the code above? From what I can tell, map() doesn't > > do anything at all on objs, even though it is a perfectly > > legitimate range (as far as I can tell). > > > > Dave > > Map is lazy and is never iterated over in your code, therefore no > side effects. Yeah, this is kind of unintended usage. Typically with map you take some input range, apply some algorithm to each element, and return a range of the results. Side effects and altering the input object itself makes me want to pull out my crucifix. You shall not have impurity in your functional style code! -- Marco