Есть ли способ получить нижеприведенную функцию для возврата согласованного типа? Я работаю с Джулией GLM (обожаю это). Я написал функцию, которая создает все возможные комбинации регрессии для набора данных. Однако мой текущий метод создания @ формула возвращает различный тип для каждой различной длины rhs
.
using GLM
function compose(lhs::Symbol, rhs::AbstractVector{Symbol})
ts = term.((1, rhs...))
term(lhs) ~ sum(ts)
end
Использование @code_warntype
для простого примера возвращает следующее
julia> @code_warntype compose(:y, [:x])
Variables
#self#::Core.Compiler.Const(compose, false)
lhs::Symbol
rhs::Array{Symbol,1}
ts::Any
Body::FormulaTerm{Term,_A} where _A
1 ─ %1 = Core.tuple(1)::Core.Compiler.Const((1,), false)
│ %2 = Core._apply(Core.tuple, %1, rhs)::Core.Compiler.PartialStruct(Tuple{Int64,Vararg{Symbol,N} where N}, Any[Core.Compiler.Const(1, false), Vararg{Symbol,N} where N])
│ %3 = Base.broadcasted(Main.term, %2)::Base.Broadcast.Broadcasted{Base.Broadcast.Style{Tuple},Nothing,typeof(term),_A} where _A<:Tuple
│ (ts = Base.materialize(%3))
│ %5 = Main.term(lhs)::Term
│ %6 = Main.sum(ts)::Any
│ %7 = (%5 ~ %6)::FormulaTerm{Term,_A} where _A
└── return %7
И проверка типа возврата нескольких различных входных данных:
julia> compose(:y, [:x]) |> typeof
FormulaTerm{Term,Tuple{ConstantTerm{Int64},Term}}
julia> compose(:y, [:x1, :x2]) |> typeof
FormulaTerm{Term,Tuple{ConstantTerm{Int64},Term,Term}}
Мы видим, что при изменении длины rhs
меняется тип возвращаемого значения.
Могу ли я изменить свою функцию compose
, чтобы она всегда возвращала один и тот же тип? Это не очень большая проблема. Компиляция для каждого нового числа регрессоров занимает всего ~ 70мс. Это действительно больше «как я могу улучшить свои навыки Джулии?»