Consider the following two functions: function f1(t, a) [t(x) for x in a] end
function f2(t, a) Dict((x, t(x)) for x in a) end When I run @code_warntype on them I get: julia> @code_warntype f1(sin, [1.0, 2.0]) Variables: #self#::#f1 t::Base.#sin a::Array{Float64,1} Body: begin return $(Expr(:invoke, LambdaInfo for collect(::Base.Generator{Array{Float64,1},Base.#sin}), :(Base.collect), :($(Expr(:new, Base.Generator{Array{Float64,1},Base.#sin}, :(t), :(a)))))) end::Array{Float64,1} julia> @code_warntype f2(sin, [1.0, 2.0]) Variables: #self#::#f2 t::Base.#sin a::Array{Float64,1} #1::##1#2{Base.#sin} Body: begin #1::##1#2{Base.#sin} = $(Expr(:new, ##1#2{Base.#sin}, :(t))) SSAValue(0) = #1::##1#2{Base.#sin} SSAValue(1) = $(Expr(:new, Base.Generator{Array{Float64,1},##1#2{Base.#sin}}, SSAValue(0), :(a))) return $(Expr(:invoke, LambdaInfo for Dict{K,V}(::Base.Generator{Array{Float64,1},##1#2{Base.#sin}}), :(Main.Dict), SSAValue(1))) end::Union{Dict{Any,Any},Dict{Float64,Float64},Dict{Union{},Union{}}} I have the folowing questions: 1. Why when f2 is used as written above the return type is not Dict{Float64,Float64} (like in the case of f1 where it is Array{Float64,1})? 2. How to fix f2 so that Julia can infer the return type? 3. Is there a way to change f2 so that first empty Dict{<element type of a>,<element type of t(a)>}() variable is created, where <element type of a> and <element type of t(a)> are determined based on the passed arguments, and only next this dictionary is populated with data? With kind regards, Bogumil Kaminski