2014-01-10 3 views
17

Могу ли я добавить информацию о типе в аргументы, являющиеся функциями?Могу ли я добавить информацию о типе в аргументы, которые являются функциями в 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} 

ответ

11

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

+1

Любой шанс Haskell-как все-в-одном объявления типа тоже? (как в нижней строке вопроса) – MRocklin

+2

Есть некоторый шанс. – StefanKarpinski

+0

Изменилось ли это с помощью 0,5? Теперь мы можем выполнить функцию hello (x :: String) :: String «Hello,» * x * "!" end' для именованных функций ... можем ли мы что-либо делать по строкам 'x :: Function {_ -> String}; x = привет? (Кстати, в приведенном выше примере 'hello :: Function' передает' typeof (hello) 'is' # hello', а 'Base.return_types (hello)' is '1-element Array {Any, 1}: String '.) – Philip

1

Это не ответ на главный вопрос, но более действительно некрасиво Временное решение 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