类型推断在常量和非常量全局变量之间有何不同?

时间:2016-02-12 18:38:42

标签: julia

来自朱莉娅docs on array comprehensions

  

以下示例计算当前的加权平均值   元素及其左右邻居沿着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被声明为常量,因为类型推断   在Julia中对非常数全局变量的效果不佳。

     

从表达式推断得到的数组类型;为了   明确地控制类型,类型可以预先添加到   理解。例如,在上面的例子中我们可以避免   将x声明为常量,并确保结果是类型   Float64写作:

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

末尾的音符是什么意思?也就是说,常量和非常量全局变量之间的类型推断是如何不同的?

1 个答案:

答案 0 :(得分:6)

我认为问题在于,如果x未被声明为const,那么Julia不知道该变量的类型是否会发生变化(因为它永远不会超出范围全球)。因此,Julia需要假设x的类型为Any

如果将x声明为const,则Julia可以安全地假设其类型不会更改,并且Julia可以根据该信息进行优化。

请注意,如果您未将x声明为const,则列表推导中返回的类型将为Array{Any,1}