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

Dou*_*son 1 julia

来自朱莉娅关于数组理解的文档:

以下示例计算沿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
Run Code Online (Sandbox Code Playgroud)

注意

在上面的示例中,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 ]
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ndt 6

我认为问题在于,如果x没有声明为a const,那么Julia不知道该变量的类型是否会发生变化(因为它永远不会超出作为全局的范围).出于这个原因,朱莉娅需要假设x属于类型Any.

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

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