Подтвердить что ты не робот

Могу ли я добавить информацию о типе в аргументы, которые являются функциями в Julia?

Можно ли добавить информацию о типе в аргументы, являющиеся функциями?

Рассмотрим следующий пример:

function f{T} (func, x::Int)
    output = Dict{Int, Any}()
    output[x] = func(x)
    return output
end 

Мне не нравится, что я должен сказать Any для типа значения словаря. Я бы скорее сделал следующее:

function f{T} (func::Function{Int->T}, x::Int)
    output = Dict{Int, T}()
    output[x] = func(x)
    return output
end 

Могу ли я предоставить типы подсказок для таких функций? Я хочу сказать следующее

f :: (Int -> T), Int -> Dict{Int, T}
4b9b3361

Ответ 1

В настоящее время нет. Однако мы можем добавить что-то в этом направлении в будущем.

Ответ 2

Это не ответ на главный вопрос, но более действительно уродливый обходной путь Any в Dict:

function f(func, x::Int)
    T = code_typed(func, (Int,))[1].args[3].typ
    output = Dict{Int, T}()
    output[x] = func(x)
    return output
end

Это, вероятно, неэффективно и, вероятно, будет работать только на простых случаях (которые даже не включают анонимные функции), например

>>> g(x) = x*2
>>> typeof(f(g, 1234))
Dict{Int64,Int64}

>>> h(x) = x > zero(x) ? x : nothing
>>> typeof(f(h, 1234))
Dict{Int64,Union(Int64,Nothing)}

EDIT:

Это работает лучше:

function f(func, x::Int)
    [x => func(x)]
end

>>> dump( f(x->2x, 3) )
Dict{Int64,Int64} len 1
    3: Int64 6