Thread overview
Reverse and sort array elements
Dec 18, 2018
Andrey
Dec 18, 2018
Simen Kjærås
Dec 18, 2018
angel
Dec 18, 2018
Andrey
Dec 18, 2018
Andrea Fontana
December 18, 2018
Hi,
Have array:
> enum array = ["qwerty", "a", "baz"];
Need to reverse and sort array elements to get this result:
> [a, ytrewq, zab]
Did this:
> enum result = array.map!(value => value.retro()).sort();
Got:
> Error: template std.algorithm.sorting.sort cannot deduce function from argument types !()(MapResult!(__lambda1, string[])), candidates are:
/usr/include/dmd/phobos/std/algorithm/sorting.d(1849,1):        std.algorithm.sorting.sort(alias less = "a < b", SwapStrategy ss = SwapStrategy.unstable, Range)(Range r) if ((ss == SwapStrategy.unstable && (hasSwappableElements!Range || hasAssignableElements!Range) || ss != SwapStrategy.unstable && hasAssignableElements!Range) && isRandomAccessRange!Range && hasSlicing!Range && hasLength!Range)

How to solve the problem?
December 18, 2018
On Tuesday, 18 December 2018 at 12:07:37 UTC, Andrey wrote:
> Hi,
> Have array:
>> enum array = ["qwerty", "a", "baz"];
> Need to reverse and sort array elements to get this result:
>> [a, ytrewq, zab]
> Did this:
>> enum result = array.map!(value => value.retro()).sort();
> Got:
>> Error: template std.algorithm.sorting.sort cannot deduce function from argument types !()(MapResult!(__lambda1, string[])), candidates are:
> /usr/include/dmd/phobos/std/algorithm/sorting.d(1849,1):        std.algorithm.sorting.sort(alias less = "a < b", SwapStrategy ss = SwapStrategy.unstable, Range)(Range r) if ((ss == SwapStrategy.unstable && (hasSwappableElements!Range || hasAssignableElements!Range) || ss != SwapStrategy.unstable && hasAssignableElements!Range) && isRandomAccessRange!Range && hasSlicing!Range && hasLength!Range)
>
> How to solve the problem?

There are in fact to instances of the same problem here:
The problem is map and retro are lazy - they return an element at a time, and so can't be sorted. You will need to make a arrays from them:

    import std.array : array;
    import std.range : retro;
    import std.algorithm : map, sort;

    enum arr = ["qwerty", "a", "baz"];
    enum result = arr
                    .map!(value => value.retro().array)
                    .array // This creates an array from map's result.
                    .sort();

--
  Simen
December 18, 2018
On Tuesday, 18 December 2018 at 12:07:37 UTC, Andrey wrote:
> Hi,
> Have array:
>> enum array = ["qwerty", "a", "baz"];
> Need to reverse and sort array elements to get this result:
>> [a, ytrewq, zab]
> Did this:
>> enum result = array.map!(value => value.retro()).sort();
> Got:
>> Error: template std.algorithm.sorting.sort cannot deduce function from argument types !()(MapResult!(__lambda1, string[])), candidates are:
> /usr/include/dmd/phobos/std/algorithm/sorting.d(1849,1):        std.algorithm.sorting.sort(alias less = "a < b", SwapStrategy ss = SwapStrategy.unstable, Range)(Range r) if ((ss == SwapStrategy.unstable && (hasSwappableElements!Range || hasAssignableElements!Range) || ss != SwapStrategy.unstable && hasAssignableElements!Range) && isRandomAccessRange!Range && hasSlicing!Range && hasLength!Range)
>
> How to solve the problem?

Did you try this ?

  import std.stdio;
  import std.algorithm;
  import std.range;
  import std.conv;

  void main()
  {
  	enum input = ["qwerty", "a", "baz"];
  	enum output = input.map!(value => value.retro().to!string()).array.sort();
	
  	writeln(input);
  	writeln(output);
  }

December 18, 2018
On Tuesday, 18 December 2018 at 12:32:35 UTC, angel wrote:
> On Tuesday, 18 December 2018 at 12:07:37 UTC, Andrey wrote:

Thank you everybody.
Here was another problem that local variable 'array' shadows function 'array()' from std.array.
December 18, 2018
On Tuesday, 18 December 2018 at 12:47:59 UTC, Andrey wrote:
> On Tuesday, 18 December 2018 at 12:32:35 UTC, angel wrote:
>> On Tuesday, 18 December 2018 at 12:07:37 UTC, Andrey wrote:
>
> Thank you everybody.
> Here was another problem that local variable 'array' shadows function 'array()' from std.array.

You call "array" the enum just like the array() function.
Change enum array into enum arr and array.map!... into arr.map!...