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()