How do a I get a type "stripped" of parameters?

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

2 Likes

doesn’t look too bad actually

1 Like

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.

2 Likes

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.

1 Like

There is another option:

basetype(::Type{T}) where T = Base.typename(T).wrapper

from https://github.com/JuliaLang/julia/issues/39952