JuliaでC++のtemplateのようなものを実現する

Juliaで例えば、グラフのエッジを逆向きにするグラフを作る関数を書くとする。

function main()
    graph = Dict{Int,Vector{Int}}()
    for v in 1:3
        graph[v] = collect(v+1:4)
    end
    println(graph)
    rev_graph = reverse_graph(graph)
    println(rev_graph)
    println(typeof(rev_graph))
end

function reverse_graph(graph)
    rev_graph = Dict()
    for pair in graph
        println(pair)
        v1 = pair.first
        for v2 in pair.second
            if haskey(rev_graph, v2)
                push!(rev_graph[v2], v1)
            else
                rev_graph[v2] = [v1]
            end
        end
    end
    return rev_graph
end

main()

こうすると、このrev_graphの型は、

Dict{Any,Any}

となってしまう。

Dict()

と書いているから当然だ。
しかし、型を書くのは面倒で馬鹿らしい。第一、型を明示的に書いてしまったら、その型でしかこの関数は使えなくなってしまう。C++のtemplateのようなことはできないのだろうか。
それ以前に、型に別名をつけることはできないのか?
調べてみると、型パラメータというもので実現できることが分かった。

const Graph{T} = Dict{T,Vector{T}}

これで、型を短く書くことができる。次のように使える。

graph = Graph{Int}()

これで、

Dict{Int64,Array{Int64,1}}

という型になる。

const Graph{T} = Dict{T,Vector{T}}

function main()
    graph = Graph{Int}()
    for v in 1:3
        graph[v] = collect(v+1:4)
    end
    println(graph)
    rev_graph = reverse_graph(graph)
    println(rev_graph)
    println(typeof(rev_graph))
end

function reverse_graph(graph::Graph{T})::Graph{T} where {T}
    rev_graph = Graph{T}()
    for pair in graph
        println(pair)
        v1 = pair.first
        for v2 in pair.second
            if haskey(rev_graph, v2)
                push!(rev_graph[v2], v1)
            else
                rev_graph[v2] = [v1]
            end
        end
    end
    return rev_graph
end

main()