-
-
Notifications
You must be signed in to change notification settings - Fork 5.6k
Closed
Labels
types and dispatchTypes, subtyping and method dispatchTypes, subtyping and method dispatch
Milestone
Description
@jakebolewski, @jiahao and I have been thinking through some type system improvements and things are starting to materialize. I believe this will consist of:
- Use
DataType
to implement tuple types, which will allow for more efficient tuples, and make tuple types less of a special case in various places. This might also open the door for user-defined covariant types in the future. (DONE) - Add
UnionAll
types around all uses of TypeVars. EachUnionAll
will bind one TypeVar, and we will nest them to allow for triangular dispatch. So far we've experimented with just sticking TypeVars wherever, and it has not really worked. We don't have a great syntax for this yet, but for now will probably use@UnionAll T<:Int Array{T}
. These are mostly equivalent to existential types. - Unspecialized parametric types will actually be UnionAll types. For example
Complex
will be bound to@UnionAll T<:Real _Complex{T}
where_Complex
is an internal type constructor. - Technically,
(Int,String)
could be a subtype of@UnionAll T (T,T)
ifT
wereUnion(Int,String)
, orAny
. However dispatch doesn't work this way because it's not very useful. We effectively have a rule that if a method parameterT
only appears in covariant position, it ranges over only concrete types. We should apply this rule explicitly by marking TypeVars as appropriate. So far this is the best way I can think of to model this behavior, but suggestions are sought. - TypeVars should only be compared by identity, and are not types themselves. We will not have syntax for introducing lone TypeVars;
@UnionAll
should suffice.
This is being prototyped in examples/juliatypes.jl
. I hope this will fix most of the following issues:
method lookup and sorting issues:
#8959 #8915 #7221 #8163
method ambiguity issues:
#8652 #8045 #6383 #6190 #6187 #6048 #5460 #5384 #3025 #1631 #270
misc. type system:
#8920 #8625 #6984 #6721 #3738 #2552 #8470
In particular, type intersection needs to be trustworthy enough that we can remove the ambiguity warning and generate a runtime error instead.
Metadata
Metadata
Assignees
Labels
types and dispatchTypes, subtyping and method dispatchTypes, subtyping and method dispatch