Ultra-pure map()?
FreeSlave
freeslave93 at gmail.com
Sat Dec 28 02:07:53 PST 2013
On Saturday, 28 December 2013 at 09:18:00 UTC, David Held wrote:
> On 12/27/2013 7:32 PM, Marco Leise wrote:> [...]
> > 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!
>
> Why not? There are many impure functional languages, and most
> non-functional languages that allow functional style allow
> mutation. OOP is all about hiding state, which is the opposite
> of referential transparency. Are you saying we should never
> map/fold over OOP ranges?
> That seems like an unnecessary restriction for dogma's sake.
> Obviously, map() has to be lazy to support infinite ranges.
> But I assume that reduce() must be eager so that you actually
> get a result (I mean, it could probably be made lazy at
> enormous expense, but that would just be silly). So, if you
> want side effects, I guess you have to do the slightly dirty
> trick of calling reduce() without actually reducing anything.
>
> I guess the "right" thing to do would be to make a new
> algorithm that implements an eager map() but perhaps doesn't
> bother with the result, called "invoke()". This carries none
> of the semantic baggage of well-known pure higher-order
> functions, and even sounds more OOP-like. Most of the other
> features of map() (like parallel iteration) are pretty nice to
> have in eager form.
>
> Dave
If you want to get result just now, then use 'array' function
from std.array module.
map!fun(range).array;
or
array(map!fun(range));
More information about the Digitalmars-d-learn
mailing list