Thread overview
why is this cast necessary?
Jun 08, 2010
Graham Fawcett
Jun 08, 2010
Graham Fawcett
Jun 08, 2010
Ellery Newcomer
June 08, 2010
Hi folks,

This program works as expected in D2:

    import std.stdio;
    import std.algorithm;

    T largestSubelement(T)(T[][] lol) {
      alias reduce!"a>b?a:b" max;
      return cast(T) max(map!max(lol));   // the cast matters...
    }

    void main() {
      auto a = [[1,2,3],[4,5,6],[8,9,7]];
      assert (largestSubelement(a) == 9);

      auto b = ["howdy", "pardner"];
      assert (largestSubelement(b) == 'y');

      auto c = [[1u, 3u, 45u, 2u], [29u, 1u]];
      assert (largestSubelement(c) == 45u);
    }

But if I leave out the 'cast(T)' in line 7, then this program will not
compile:

lse.d(6): Error: cannot implicitly convert expression
		  (reduce(map(lol))) of type dchar to immutable(char)
lse.d(14): Error: template instance
		   lse.largestSubelement!(immutable(char)) error
instantiating

Where did the 'dchar' came from? And why does the cast resolve the issue?

Best,
Graham

June 08, 2010
On Mon, 07 Jun 2010 23:02:48 -0400, Graham Fawcett <fawcett@uwindsor.ca> wrote:

> Hi folks,
>
> This program works as expected in D2:
>
>     import std.stdio;
>     import std.algorithm;
>
>     T largestSubelement(T)(T[][] lol) {
>       alias reduce!"a>b?a:b" max;
>       return cast(T) max(map!max(lol));   // the cast matters...
>     }
>
>     void main() {
>       auto a = [[1,2,3],[4,5,6],[8,9,7]];
>       assert (largestSubelement(a) == 9);
>
>       auto b = ["howdy", "pardner"];
>       assert (largestSubelement(b) == 'y');
>
>       auto c = [[1u, 3u, 45u, 2u], [29u, 1u]];
>       assert (largestSubelement(c) == 45u);
>     }
>
> But if I leave out the 'cast(T)' in line 7, then this program will not
> compile:
>
> lse.d(6): Error: cannot implicitly convert expression
> 		  (reduce(map(lol))) of type dchar to immutable(char)
> lse.d(14): Error: template instance
> 		   lse.largestSubelement!(immutable(char)) error
> instantiating
>
> Where did the 'dchar' came from? And why does the cast resolve the issue?

In a recent update, Andrei changed char[] and wchar[] to bi-directional ranges of dchar instead of straight arrays (at least, I think that was the change) in the eyes of the range types.  I think this is where the dchar comes from.

If you had a char[], and the 'max' element was a sequence of 2 code points, how do you return a single char for that result?

-Steve
June 08, 2010
On 06/07/2010 10:02 PM, Graham Fawcett wrote:
> Hi folks,
>
> This program works as expected in D2:
>
>      import std.stdio;
>      import std.algorithm;
>
>      T largestSubelement(T)(T[][] lol) {
>        alias reduce!"a>b?a:b" max;
>        return cast(T) max(map!max(lol));   // the cast matters...
>      }
>
>      void main() {
>        auto a = [[1,2,3],[4,5,6],[8,9,7]];
>        assert (largestSubelement(a) == 9);
>
>        auto b = ["howdy", "pardner"];
>        assert (largestSubelement(b) == 'y');
>
>        auto c = [[1u, 3u, 45u, 2u], [29u, 1u]];
>        assert (largestSubelement(c) == 45u);
>      }
>
> But if I leave out the 'cast(T)' in line 7, then this program will not
> compile:
>
> lse.d(6): Error: cannot implicitly convert expression
> 		  (reduce(map(lol))) of type dchar to immutable(char)
> lse.d(14): Error: template instance
> 		   lse.largestSubelement!(immutable(char)) error
> instantiating
>
> Where did the 'dchar' came from? And why does the cast resolve the issue?
>
> Best,
> Graham
>

Curious. in std.array, for string types front is defined as

dchar front(A)(A a);

ick. unicode.
June 08, 2010
Hi Steve,

On Mon, 07 Jun 2010 23:46:40 -0400, Steven Schveighoffer wrote:

> On Mon, 07 Jun 2010 23:02:48 -0400, Graham Fawcett <fawcett@uwindsor.ca> wrote:
> 
>> Hi folks,
>>
>> This program works as expected in D2:
>>
>>     import std.stdio;
>>     import std.algorithm;
>>
>>     T largestSubelement(T)(T[][] lol) {
>>       alias reduce!"a>b?a:b" max;
>>       return cast(T) max(map!max(lol));   // the cast matters...
>>     }
>>
>>     void main() {
>>       auto a = [[1,2,3],[4,5,6],[8,9,7]];
>>       assert (largestSubelement(a) == 9);
>>
>>       auto b = ["howdy", "pardner"];
>>       assert (largestSubelement(b) == 'y');
>>
>>       auto c = [[1u, 3u, 45u, 2u], [29u, 1u]];
>>       assert (largestSubelement(c) == 45u);
>>     }
>>
>> But if I leave out the 'cast(T)' in line 7, then this program will not
>> compile:
>>
>> lse.d(6): Error: cannot implicitly convert expression
>> 		  (reduce(map(lol))) of type dchar to immutable(char)
>> lse.d(14): Error: template instance
>> 		   lse.largestSubelement!(immutable(char)) error
>> instantiating
>>
>> Where did the 'dchar' came from? And why does the cast resolve the issue?
> 
> In a recent update, Andrei changed char[] and wchar[] to bi-directional ranges of dchar instead of straight arrays (at least, I think that was the change) in the eyes of the range types.  I think this is where the dchar comes from.
> 
> If you had a char[], and the 'max' element was a sequence of 2 code points, how do you return a single char for that result?

Thank you. This makes sense.

Regards,
Graham