Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
August 21, 2010 map on fixed-size arrays | ||||
---|---|---|---|---|
| ||||
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 Re: map on fixed-size arrays | ||||
---|---|---|---|---|
| ||||
Posted in reply to Eduardo Cavazos | 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 Re: map on fixed-size arrays | ||||
---|---|---|---|---|
| ||||
Posted in reply to Eduardo Cavazos | 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 Re: map on fixed-size arrays | ||||
---|---|---|---|---|
| ||||
Posted in reply to Eduardo Cavazos | 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 Re: map on fixed-size arrays | ||||
---|---|---|---|---|
| ||||
Posted in reply to Eduardo Cavazos | 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
|
Copyright © 1999-2021 by the D Language Foundation