Why does this return false
IntOrString = Union{Int,AbstractString}
(IntOrString <: String, IntOrString <: Int)
I am not questioning the decision, just curious to know the reason behind it
Also while we are at it why are unions not a DataType
Union <: DataType
DataType <: Union
Because, in your example, an Int is not a subtype of String. Think about it like sets. You have the set of all Int unioned with all AbstractString. This is clearly bigger than the set of String. In fact you have:
julia> String <: IntOrString
true
5 Likes
I think I might have figured it out
Union are not treated as a DataType, because typeof(), can never return a Union
The type of a value can never be a Union
But now this make me think that
IntOrString <: String
should instead raise an error, not just return false
No. It is critical for Julia that <: return either true or false for every combination of types.
3 Likes
I’m not sure what you mean but note:
julia> abstract type Foo end
julia> Foo isa DataType
true
but typeof can never return Foo.
3 Likes
It can never return Foo, because Foo is an abstract type, that cannot be instantiated
Only concrete type can be instantiated
Exactly, IntOrString is not a type or a DataType , its more like a function on Types, but is not itself a type , hence the raise an error make sense to me
Yes, I know, my point was that you said
and I gave an example of where something is treated as a DataType even though typeof cannot return it.
1 Like
Unions not being of type DataType has nothing to do with the fact that IntOrString <: String == false.
Let’s say you have a cage whose dweller has the type const HamsterOrBird = Union{Hamster, AbstractBird}. When you ask HamsterOrBird <: Canary, it means “if I know that there is a HamsterOrBird in the cage, can I be sure that the caged creature is a Canary?”
Maybe you meant the subtyping in the opposite direction? IntOrString >: String is true, meaning that if x isa String then x isa IntOrString.
4 Likes
Also note that
julia> Union{Int,UInt} <: Integer
true
julia> Union{Int,UInt}
Union{Int64, UInt64}
julia> typeof(Union{Int,UInt})
Union
julia> typeof(Integer)
DataType
The typeof of a Type has little to do with the subtype relation.
6 Likes