struct Foo{T} end
What function takes Foo{Int}
and returns the parent UnionAll
type, Foo
?
struct Foo{T} end
What function takes Foo{Int}
and returns the parent UnionAll
type, Foo
?
julia> a
Rational{Int64}
julia> a.name.wrapper
Rational
Thanks, but I was wondering if there is something in the public API to do this. Or is this stable? (a.name
used to have different behaviour, if I recall correctly)
no and no, the objective you’re after is “hacky” to begin with
Can you elaborate on why my query is ill-defined? Are you suggesting that there may be no least upper bound for a concrete type with parameters, among all UnionAll
types? Or that there could be more than one?
the “wrapper type without parametric types” information is not captured by Julia’s typing system:
julia> f(x::T{Int64}) where T = T
ERROR:
Attempts to grab it will be fully dynamic. Possible solutions include what I described (which should be semi-stable tbh), or eval()
ing the names, pick your poison
I think eval(nameof(Foo{T} where T))
does what you’re looking for, but it’s not type-stable.
julia> struct Foo{T} end
julia> eval(nameof(Foo{Int}))
Foo
This is the solution that was alluded to above, but recommended against.
Great. In my use case performance is not important.
Also see https://github.com/JuliaObjects/ConstructionBase.jl/blob/master/src/ConstructionBase.jl#L27 and it’s note https://github.com/JuliaObjects/ConstructionBase.jl/blob/master/src/constructorof.md. I think that does what you want.
There is another option:
basetype(::Type{T}) where T = Base.typename(T).wrapper