Thread overview
map on fixed-size arrays
Aug 21, 2010
Eduardo Cavazos
Aug 21, 2010
bearophile
Aug 21, 2010
Dmitry Olshansky
Aug 21, 2010
Pelle
August 21, 2010
Hello,

The 'map' from std.algorithm doesn't seem to work with fixed-size arrays:

----------------------------------------------------------------------
import std.stdio ;
import std.math ;
import std.algorithm ;

T sq ( T ) ( T x ) { return x*x ; }

void main ()
{
  double [2] a = [ 1.0 , 2.0 ] ;

  writeln ( map ! ( sq ) ( a ) ) ;
}
----------------------------------------------------------------------

$ rdmd test_map_sq_fixed_size_b.d
/usr/include/d/dmd/phobos/std/algorithm.d(108): Error: template instance Map!(sq,double[2u]) does not match template declaration Map(alias fun,Range) if (isInputRange!(Range))

Is this an intended limitation?

Ed
August 21, 2010
Eduardo Cavazos:

> The 'map' from std.algorithm doesn't seem to work with fixed-size arrays:

See bug 4114
In my opinion map, sort, etc have to work with fixed-sized arrays too (otherwise I'll have to write more wrappers).

Bye,
bearophile
August 21, 2010
On 21.08.2010 14:37, Eduardo Cavazos wrote:
> Hello,
>
> The 'map' from std.algorithm doesn't seem to work with fixed-size arrays:
>
> ----------------------------------------------------------------------
> import std.stdio ;
> import std.math ;
> import std.algorithm ;
>
> T sq ( T ) ( T x ) { return x*x ; }
>
> void main ()
> {
>   double [2] a = [ 1.0 , 2.0 ] ;
>
>   writeln ( map ! ( sq ) ( a ) ) ;
> }
> ----------------------------------------------------------------------
>
> $ rdmd test_map_sq_fixed_size_b.d
> /usr/include/d/dmd/phobos/std/algorithm.d(108): Error: template instance Map!(sq,double[2u]) does not match template declaration Map(alias fun,Range) if (isInputRange!(Range))
>
> Is this an intended limitation?
>
> Ed
You always can workaround this by taking full slice:

import std.stdio ;
import std.math ;
import std.algorithm ;

T sq ( T ) ( T x ) { return x*x ; }

void main ()
{
  double [2] a = [ 1.0 , 2.0 ] ;

  writeln ( map ! ( sq ) ( a[] ) ) ;
}

I'm not sure if it's by design.

-- 
Dmitry Olshansky

August 21, 2010
On 08/21/2010 12:37 PM, Eduardo Cavazos wrote:
> Hello,
>
> The 'map' from std.algorithm doesn't seem to work with fixed-size arrays:
>
> ----------------------------------------------------------------------
> import std.stdio ;
> import std.math ;
> import std.algorithm ;
>
> T sq ( T ) ( T x ) { return x*x ; }
>
> void main ()
> {
> double [2] a = [ 1.0 , 2.0 ] ;
>
> writeln ( map ! ( sq ) ( a ) ) ;
> }
> ----------------------------------------------------------------------
>
> $ rdmd test_map_sq_fixed_size_b.d
> /usr/include/d/dmd/phobos/std/algorithm.d(108): Error: template instance
> Map!(sq,double[2u]) does not match template declaration Map(alias
> fun,Range) if (isInputRange!(Range))
>
> Is this an intended limitation?
>
> Ed

IIRC, it's intended. Use a[] to get a dynamic array from a.
August 21, 2010
On 8/21/10 5:37 CDT, Eduardo Cavazos wrote:
> Hello,
>
> The 'map' from std.algorithm doesn't seem to work with fixed-size arrays:
>
> ----------------------------------------------------------------------
> import std.stdio ;
> import std.math ;
> import std.algorithm ;
>
> T sq ( T ) ( T x ) { return x*x ; }
>
> void main ()
> {
> double [2] a = [ 1.0 , 2.0 ] ;
>
> writeln ( map ! ( sq ) ( a ) ) ;
> }
> ----------------------------------------------------------------------
>
> $ rdmd test_map_sq_fixed_size_b.d
> /usr/include/d/dmd/phobos/std/algorithm.d(108): Error: template instance
> Map!(sq,double[2u]) does not match template declaration Map(alias
> fun,Range) if (isInputRange!(Range))
>
> Is this an intended limitation?
>
> Ed

To some extent, yes; fixed-size arrays are passed by value and most of the time you don't want that with an algorithm. You have the burden to append "[]" to fixed-size arrays so they are passed inside the algorithms as dynamic-length slices.

std.algorithm could detect that and take care of that detail for you, at the cost of duplicating most function signatures.


Andrei