2014-12-23 8 views
7

Wenn ich versuche, eine Array mit einer Liste Verständnis zu schaffen, kommt es zu einem Array{Any, 1} auch wenn ich alle Elemente „Symbol“ kodieren:Warum gibt dieses Listenverständnis ein Array {Any, 1} statt eines Array {Symbol, 1} zurück?

julia> u_col_names=[symbol("user_id"), symbol("age"), symbol("sex"), symbol("occupation"), symbol("zip_code")] 
5-element Array{Symbol,1}: 
:user_id 
:age  
:sex  
:occupation 
:zip_code 

julia> col_names=["user_id", "age", "sex", "occupation", "zip_code"] 
5-element Array{ASCIIString,1}: 
"user_id" 
"age"  
"sex"  
"occupation" 
"zip_code" 

julia> u_col_names=[symbol(col_names[i]) for i in 1:size(col_names)[1]] 
5-element Array{Any,1}: 
:user_id 
:age  
:sex  
:occupation 
:zip_code 

Warum letzte Liste Verständnis ist, dass anstelle eines eine Array{Any, 1} zurückkehren Array{Symbol, 1}? Beachten Sie, dass die folgende tut Rückkehr eine Array{Symbol, 1}:

julia> u_col_names=[symbol("col_names$i") for i in 1:size(col_names)[1]] 
5-element Array{Symbol,1}: 
:col_names1 
:col_names2 
:col_names3 
:col_names4 
:col_names5 

Interessanterweise tut dies folgendes:

julia> col_names[1] 
"user_id" 

julia> symbol(col_names[1]) 
:user_id 

julia> [symbol(col_names[1]), symbol(col_names[2])] 
2-element Array{Symbol,1}: 
:user_id 
:age  

Was bin ich?

Antwort

8

Nach this discussion in der Ausgabe-Tracker der JuliaLang/julia repo on GitHub scheint das Problem von einem Mangel von Julias Typ-Inferenz-System herrühren. Jeff Bezanson (einer der Julia Schriftsteller und Maintainer) hinterließ eine relevant comment in another discussion:

Dieses Verhalten tatsächlich im Moment erwartet wird. Da [col_names] global ist, kann es sich überall ändern, so dass wir nicht davon ausgehen können, dass wir seinen Typ kennen. Das ist zu pessimistisch, aber es ist schwer, eine Regel zu finden, die uns besser machen würde.

Überraschenderweise vielleicht (as observed by John Myles White), ist die Art richtig gefolgert, wenn diese Vorgänge in einer Funktion ausgeführt werden:

julia> function fun() 
     col_names=["user_id", "age", "sex", "occupation", "zip_code"] 
     return u_col_names=[symbol(item) for item in col_names] 
     end 
fun (generic function with 1 method) 

julia> fun() 
5-element Array{Symbol,1}: 
:user_id 
:age  
:sex  
:occupation 
:zip_code 

Als Alternative zu Ihrer Liste Verständnis, können Sie map(symbol, <Array{T,1}>) verwenden, die tut ein Array{Symbol,1}, auch im globalen Bereich zurück:

julia> col_names=["user_id", "age", "sex", "occupation", "zip_code"] 
5-element Array{ASCIIString,1}: 
"user_id" 
"age"  
"sex"  
"occupation" 
"zip_code" 

julia> map(symbol, col_names) 
5-element Array{Symbol,1}: 
:user_id 
:age  
:sex  
:occupation 
:zip_code 
+1

das allgemeine Prinzip ist, dass innerhalb von Funktionen, die comp Ich weiß "alles": die Arten der Eingaben und die Transformationen, die angewendet werden. Folglich kann es sich aggressiver spezialisieren. – tholy

+0

@tholy Danke für Ihren Kommentar. Kannst du dir eine empfohlene Lektüre darüber denken? – Jubobs