Scala future, Sing#
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Tue Aug 25 11:47:35 PDT 2009
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).
Andrei
More information about the Digitalmars-d
mailing list