# A question about parametric types

**URL:** <https://discourse.julialang.org/t/a-question-about-parametric-types/12149>\
**Category:** General Usage\
**Created:** [July 4, 2018, 12:28am UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149 "2018-07-04T00:28:38Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![Qiyamah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/qiyamah/32/2660_2.png) [@Qiyamah](https://discourse.julialang.org/u/Qiyamah)\
**Post date:** [July 4, 2018, 12:28am UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/1 "2018-07-04T00:28:38Z")

</div>

Hi  
I have the following problem:

```julia
struct MyType{T}
end

function get_root_type(typ::Type)
#what goes here?
end

rt = get_root_type(MyType{Int})

```

i need rt to contain type MyType , without any parameter.

Is there a way to do this?  
Thanks

---

<div class="post-metadata">

**Author:** ![chakravala](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chakravala/32/6832_2.png) [@chakravala](https://discourse.julialang.org/u/chakravala)\
**Post date:** [July 4, 2018, 3:45am UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/2 "2018-07-04T03:45:53Z")

</div>

How about this?

```nohighlight
struct MyType{T}
end

get_root_type{T}(::MyType{T}) = T

get_root_type(typ::Type) = get_root_type(eval(:($typ()))

```

Then

```nohighlight
julia> rt = get_root_type(MyType{Int})
Int64

```

---

<div class="post-metadata">

**Author:** ![Qiyamah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/qiyamah/32/2660_2.png) [@Qiyamah](https://discourse.julialang.org/u/Qiyamah)\
**Post date:** [July 4, 2018, 4:13am UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/3 "2018-07-04T04:13:39Z")

</div>

This is not what i want, i don’t want the parameter, i want MyType  
and MyType can be any type with parameters.  
Thanks.

---

<div class="post-metadata">

**Author:** ![chakravala](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chakravala/32/6832_2.png) [@chakravala](https://discourse.julialang.org/u/chakravala)\
**Post date:** [July 4, 2018, 4:25am UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/4 "2018-07-04T04:25:11Z")

</div>

Oh okay, this is one way of getting it using Regex

```nohighlight
get_root_type(typ::Type) = match(r"[^({.+})]+",string(typ)).match |> Symbol |> eval

```

Then

```nohighlight
julia> rt = get_root_type(MyType{Int})
MyType

```

---

<div class="post-metadata">

**Author:** ![Per](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/per/32/10387_2.png) [@Per](https://discourse.julialang.org/u/Per)\
**Post date:** [July 4, 2018, 4:38am UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/5 "2018-07-04T04:38:30Z")

</div>

```julia
get_root_type(typ::Type) = typ.name.wrapper

```

---

<div class="post-metadata">

**Author:** ![Per](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/per/32/10387_2.png) [@Per](https://discourse.julialang.org/u/Per)\
**Post date:** [July 4, 2018, 5:45am UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/7 "2018-07-04T05:45:26Z")

</div>

That will not change anything.

```julia
julia> struct MyType{T}
       end

julia> typeof(MyType)
UnionAll

julia> UnionAll <: Type
true

```

---

<div class="post-metadata">

**Author:** ![tkoolen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tkoolen/32/1603_2.png) [@tkoolen](https://discourse.julialang.org/u/tkoolen)\
**Post date:** [July 4, 2018, 6:15am UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/8 "2018-07-04T06:15:09Z")

</div>

What’s your intended application?

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [July 4, 2018, 6:30am UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/9 "2018-07-04T06:30:20Z")

</div>

In v0.7, there is `nameof`, eg

```julia
julia> struct MyType{T} end

julia> nameof(MyType{Int})
:MyType

```

In v0.6 I think it was `Base.datatype_name`.

> [@chakravala](#):
>
> Oh okay, this is one way of getting it using Regex
> 
> ```julia
> get_root_type(typ::Type) = match(r"[^({.+})]+",string(typ)).match |> Symbol |> eval
> 
> ```

This is gloriously horrible 😉

---

<div class="post-metadata">

**Author:** ![chakravala](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chakravala/32/6832_2.png) [@chakravala](https://discourse.julialang.org/u/chakravala)\
**Post date:** [July 4, 2018, 6:42am UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/10 "2018-07-04T06:42:01Z")

</div>

> [@Tamas\_Papp](#):
>
> This is gloriously horrible 😉

this is Julia, so if you don’t know an official way of doing things, you can usually at least easily create an inefficient way of doing something, until someone corrects it

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [July 4, 2018, 7:14am UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/11 "2018-07-04T07:14:07Z")

</div>

As a general rule, going to strings and back for reflection/metaprogramming is usually a sign that you are not using something provided by the language.

---

<div class="post-metadata">

**Author:** ![Qiyamah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/qiyamah/32/2660_2.png) [@Qiyamah](https://discourse.julialang.org/u/Qiyamah)\
**Post date:** [July 4, 2018, 6:29pm UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/12 "2018-07-04T18:29:09Z")

</div>

Yes you are right, this calls for an application related solution which i generated the required functions via metaprogramming.

Thanks…

---

<div class="post-metadata">

**Author:** ![Qiyamah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/qiyamah/32/2660_2.png) [@Qiyamah](https://discourse.julialang.org/u/Qiyamah)\
**Post date:** [July 4, 2018, 6:29pm UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/13 "2018-07-04T18:29:41Z")

</div>

Thanks.  
This also works.

---

<div class="post-metadata">

**Author:** ![Qiyamah](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/qiyamah/32/2660_2.png) [@Qiyamah](https://discourse.julialang.org/u/Qiyamah)\
**Post date:** [July 4, 2018, 6:47pm UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/14 "2018-07-04T18:47:26Z")

</div>

This wouldn’t work if the type is in a different module such as MyModule.MyType  
Thanks

---

<div class="post-metadata">

**Author:** ![jandehaan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jandehaan/32/6805_2.png) [@jandehaan](https://discourse.julialang.org/u/jandehaan)\
**Post date:** [July 4, 2018, 7:32pm UTC](https://discourse.julialang.org/t/a-question-about-parametric-types/12149/15 "2018-07-04T19:32:29Z")

</div>

> [@Qiyamah](#):
>
> function get\_root\_type(typ::Type)  
> #what goes here?  
> end

Try

```julia
function get_root_type(typ::Type)
    typ.name
end

```

Purists may object, but it gets the job done.
