来自朱莉娅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 ]
末尾的音符是什么意思?也就是说,常量和非常量全局变量之间的类型推断是如何不同的?
答案 0 :(得分:6)
我认为问题在于,如果x
未被声明为const
,那么Julia不知道该变量的类型是否会发生变化(因为它永远不会超出范围全球)。因此,Julia需要假设x
的类型为Any
。
如果将x
声明为const
,则Julia可以安全地假设其类型不会更改,并且Julia可以根据该信息进行优化。
请注意,如果您未将x
声明为const,则列表推导中返回的类型将为Array{Any,1}