# Counting all subtypes

**URL:** <https://discourse.julialang.org/t/counting-all-subtypes/38797>\
**Category:** New to Julia\
**Tags:** question, type\
**Created:** [May 5, 2020, 10:10am UTC](https://discourse.julialang.org/t/counting-all-subtypes/38797 "2020-05-05T10:10:26Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![br500](https://avatars.discourse-cdn.com/v4/letter/b/b5a626/32.png) [@br500](https://discourse.julialang.org/u/br500)\
**Post date:** [May 5, 2020, 10:10am UTC](https://discourse.julialang.org/t/counting-all-subtypes/38797/1 "2020-05-05T10:10:26Z")

</div>

I’m trying to count **all** subtypes of given type (subtypes of these subtypes and so on) with a recursive function, but for now I only managed to write one showing the structure by creating arrays in arrays…

```julia
function allSubtypes(T::Type)
    if length(subtypes(T)) > 0
        return allSubtypes.(subtypes(T))
    else
        return T
    end
end

```

---

<div class="post-metadata">

**Author:** ![tamasgal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamasgal/32/27946_2.png) [@tamasgal](https://discourse.julialang.org/u/tamasgal)\
**Post date:** [May 5, 2020, 10:38am UTC](https://discourse.julialang.org/t/counting-all-subtypes/38797/2 "2020-05-05T10:38:42Z")

</div>

Something like this?

```julia
julia> function countsubtypes(T::Type; recursive=false)
           _subtypes = subtypes(T)
           n = length(_subtypes)
           if !recursive
               return n
           end
           n + sum(countsubtypes(_T) for _T in _subtypes)
       end
countsubtypes (generic function with 1 method)

julia> countsubtypes(Integer; recursive=true)
14

julia> countsubtypes(Integer; recursive=false)
3

julia> countsubtypes(Signed; recursive=false)
6

julia> countsubtypes(Signed; recursive=true)
6

```

---

<div class="post-metadata">

**Author:** ![br500](https://avatars.discourse-cdn.com/v4/letter/b/b5a626/32.png) [@br500](https://discourse.julialang.org/u/br500)\
**Post date:** [May 5, 2020, 10:56am UTC](https://discourse.julialang.org/t/counting-all-subtypes/38797/3 "2020-05-05T10:56:07Z")

</div>

Yes! But I think that the output for some types will be incorrect, for example Number gives 7.

---

<div class="post-metadata">

**Author:** ![tamasgal](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamasgal/32/27946_2.png) [@tamasgal](https://discourse.julialang.org/u/tamasgal)\
**Post date:** [May 5, 2020, 10:58am UTC](https://discourse.julialang.org/t/counting-all-subtypes/38797/4 "2020-05-05T10:58:33Z")

</div>

Feel free to debug it ; ) I can have a look later, currently in a video conference…

---

<div class="post-metadata">

**Author:** ![br500](https://avatars.discourse-cdn.com/v4/letter/b/b5a626/32.png) [@br500](https://discourse.julialang.org/u/br500)\
**Post date:** [May 5, 2020, 11:00am UTC](https://discourse.julialang.org/t/counting-all-subtypes/38797/5 "2020-05-05T11:00:32Z")

</div>

Sure! Thank you for help, I’ll try my best. Have a nice conference 🙂

---

<div class="post-metadata">

**Author:** ![Fliks](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/fliks/32/2494_2.png) [@Fliks](https://discourse.julialang.org/u/Fliks)\
**Post date:** [May 5, 2020, 1:24pm UTC](https://discourse.julialang.org/t/counting-all-subtypes/38797/6 "2020-05-05T13:24:14Z")

</div>

You have to make the call of the countsubtypes function in the sum recursive to walk the full subtype tree.

```julia
function countsubtypes(T::Type; recursive=false)
           _subtypes = subtypes(T)
           @show _subtypes
           n = length(_subtypes)
           if !recursive || n == 0
               return n
           end
           n + sum(countsubtypes(_T, recursive=true) for _T in _subtypes)
       end

```

---

<div class="post-metadata">

**Author:** ![br500](https://avatars.discourse-cdn.com/v4/letter/b/b5a626/32.png) [@br500](https://discourse.julialang.org/u/br500)\
**Post date:** [May 5, 2020, 1:47pm UTC](https://discourse.julialang.org/t/counting-all-subtypes/38797/7 "2020-05-05T13:47:54Z")

</div>

Exactly, thanks :))
