2014-01-10 3 views
17

Kann ich Typinformationen zu Argumenten hinzufügen, die Funktionen sind?Kann ich Informationen zu Argumenten hinzufügen, die in Julia funktionieren?

Betrachten Sie das folgende Beispiel:

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

Ich mag es nicht, dass ich Any für den Werttyp des Wörterbuchs zu sagen haben. Ich würde eher das folgende tun:

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

Kann ich Typhinweise solcher Funktionen zur Verfügung stellen? Ich möchte Folgendes sagen:

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

Antwort

11

Derzeit nicht. Wir können jedoch in Zukunft etwas hinzufügen. Diese

+1

Jede Chance von Haskell-like all-in-one zu Typdeklarationen? (wie die untere Zeile der Frage) – MRocklin

+2

Es gibt eine Chance. – StefanKarpinski

+0

Hat sich das mit 0,5 geändert? Wir können jetzt 'function hallo (x :: String) :: String" Hallo ", * x *"! " Ende für benannte Funktionen ... können wir alles in der Art von 'x :: Function {_ -> String}; x = Hallo? (Im obigen Beispiel wird 'hallo :: Function 'übergeben,' typeof (hallo) 'ist' # hallo' und 'Base.return_types (hello)' ist '1-element Array {Any, 1}: String '.) – Philip

1

ist keine Antwort auf die Hauptfrage, sondern mehr ein wirklich hässlich Abhilfe die Any in der Dict Ausgabe:

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 

, die wahrscheinlich nicht effizient ist und wird wahrscheinlich funktionieren nur auf einfache Fälle (die anonymen Funktionen nicht einmal enthalten) wie

>>> 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:

Das funktioniert besser:

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

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