On Tue, Aug 25, 2009 at 11:47 AM, Andrei
Alexandrescu<seewebsiteforem...@erdani.org> wrote:
> Walter Bright wrote:
>>>>>
>>>>> Especially the array literal type inference is really naive.
>>>>
>>>> How should it be done?
>>>
>>> You shouldn't use the type of the first given element when constructing
>>> the type of the array. If you have [ e_1, ..., e_n ], the type of the
>>> literal is
>>> unify(type_of_e_1, ..., type_of_e_n) + "[]". For instance:
>>>
>>> => typeof([ [], [1,2,3] ])
>>> => unify( typeof([]), typeof([1,2,3]) ) + "[]"
>>> => unify( "a[]", unify(typeof(1),typeof(2),typeof(3)) + "[]" ) + "[]"
>>> => unify( "a[]", unify("int","int","int") + "[]" ) + "[]"
>>> => unify( "a[]", "int" + "[]" ) + "[]"
>>> => unify( "a[]", "int[]" ) + "[]"   // a is a local type var, subst = { a
>>> -> int }
>>> => "int[]" + "[]"
>>> => "int[][]"
>>
>> Ok.
>
> Walter: I told you :o).
>
> I'd already defined the unify meta-function, it's called CommonType, see
>
> http://www.digitalmars.com/d/2.0/phobos/std_traits.html#CommonType
>
> You pass any number of types and it will figure out the type that all types
> can be converted to. Using that, it is trivial to define functions that
> infer array types properly. At a point I had an array() function that took
> any number of arguments and returned a correctly-typed array. Then I dropped
> that and defined array() in std with a different meaning (transform a range
> into an array).

That's also the rule used by NumPy.  I found D's array behavior very surprising.

--bb

Reply via email to