feature request: N-ary map

w0rp devw0rp at gmail.com
Fri Aug 30 23:48:46 PDT 2013


On Saturday, 22 June 2013 at 00:07:40 UTC, Timothee Cour wrote:
> On Fri, Jun 21, 2013 at 4:14 PM, Timothee Cour 
> <thelastmammoth at gmail.com>wrote:
>
>> On Fri, Jun 21, 2013 at 4:02 PM, Ali Çehreli 
>> <acehreli at yahoo.com> wrote:
>>
>>> On 06/21/2013 03:57 PM, Diggory wrote:
>>>
>>>> On Friday, 21 June 2013 at 22:56:04 UTC, Andrei Alexandrescu 
>>>> wrote:
>>>>
>>>>> On 6/21/13 3:55 PM, Andrei Alexandrescu wrote:
>>>>>
>>>>>> On 6/21/13 3:45 PM, Timothee Cour wrote:
>>>>>>
>>>>>>> I'd like to support N-ary map, ie std.algorithm.map that 
>>>>>>> takes 1 or
>>>>>>> more
>>>>>>> ranges as arguments and operates lazily on those.
>>>>>>>
>>>>>>
>>>  You can use "zip" from std.range.
>>>>
>>>
>>> Timothee specifically said that he is trying to avoid zip: :)
>>>
>>>
>>> > before:
>>> >   zip(a,b).map!(u=>absDiff(u[0],**u[1])).reduce!fun;
>>> > after:
>>> >   map!absDiff(a,b).reduce!fun;
>>>
>>> Ali
>>>
>>
>> also works great with string lambdas:
>> eg: dotproduct:
>>
>> before:
>>   zip(u,v).map!"a[0]*a[1]".reduce!"a+b";
>> after:
>>   map!"a*b"(u,v).reduce!"a+b";
>>
>> => clearer, and provides more room for optimizaton
>>
>>
>
> actually the version without the proposed N-ary map is even 
> worse, because
> zip uses StoppingPolicy.shortest by default (which i find weird 
> and
> contrary to D's safe by default stance):
>
> here's the (corrected) dotproduct:
>
> before:
>   
> zip(StoppingPolicy.requireSameLength,u,v).map!"a[0]*a[1]".reduce!"a+b";
> after:
>   map!"a*b"(u,v).reduce!"a+b";
>
> i think it's a clear improvement in terms of clarity (and again,
> optimizations possible).

There we have it. zip + map is the body of the generic function
desired. Optimise later if needed.


More information about the Digitalmars-d mailing list