2016-02-12 32 views
1

從朱莉婭​​:類型推斷在常量和非常量全局變量之間有何不同?

下面的示例計算當前 元件和沿1-d網格其左,右相鄰的一個加權平均值。 :

julia> const x = rand(8) 
8-element Array{Float64,1}: 
0.843025 
0.869052 
0.365105 
0.699456 
0.977653 
0.994953 
0.41084 
0.809411 

julia> [ 0.25*x[i-1] + 0.5*x[i] + 0.25*x[i+1] for i=2:length(x)-1 ] 
6-element Array{Float64,1}: 
0.736559 
0.57468 
0.685417 
0.912429 
0.8446 
0.656511 

在上面的例子中,x被聲明爲常量,因爲在朱莉婭的類型推斷 不上非恆定的全局變量正常工作。

生成的數組類型從表達式推斷出來;爲了使 明確地控制該類型,該類型可以被預先考慮到 的理解。例如,在上面的例子中,我們本來可以避免 聲明x作爲常數,確保了結果的類型 Float64以書面形式:

Float64[ 0.25*x[i-1] + 0.5*x[i] + 0.25*x[i+1] for i=2:length(x)-1 ] 

什麼是接近尾聲的說明是什麼意思?也就是說,類型推斷在常量和非常量全局變量之間有何不同?

+2

如果取出'const',你最終得到的'6個元素的數組任何',而不是'Float64'。請注意,如果您將代碼移入函數中,即使沒有「const」,您也會得到一個「Float64」數組。但是,我不太瞭解類型推斷行爲以充分回答您的問題。 –

+1

參考:問題[#8870](https://github.com/JuliaLang/julia/issues/8870) – SalchiPapa

回答

6

我相信問題是,如果x沒有被聲明爲const,那麼朱莉婭不知道該變量的類型是否會改變(因爲它不會作爲全局超出範圍)。因此,Julia需要假設xAny

如果x被聲明爲const,但是,Julia可以安全地假定它的類型不會改變,並且Julia可以根據該信息進行優化。

需要注意的是,如果你不聲明x作爲一個常量,然後從列表理解返回的類型將是Array{Any,1}