我可以在 Julia 的列表理解中创建一个匿名函数。我希望这会创建一种Vector{Function}
. 相反,类型类似于Vector{var"#2#4"}
.
例如,当涉及具有匿名函数的外部作用域时
typeof(x->x) <: Function # true
a = 1
typeof(x-> x + a) <: Function # false
尽管
f(x) = x
typeof(f) <: Function # true
a = 1
g(x) = x + a
typeof(g) <: Function # true
当涉及外部作用域时,为什么匿名函数的类型与常规函数不同?
现在,在列表理解中:
typeof([x->x, x->x]) <: AbstractVector{Function} # true
typeof([x->x+i for i in 1:2]) <: AbstractVector{Function} # false
typeof([x->x for i in 1:2]) <: AbstractVector{Function} # false
是否i
涉及索引。我最初预计true
每种情况都会发生。
首先请注意,您最初的示例不正确,因为您有:
因此,两个匿名函数的类型都是 的子类型
Function
。现在就理解而言,请注意,这主要与参数的存在无关,因为您有:
出现这种行为的原因是,当您编写类似的内容
[...]
时,Julia 会选择推导式的狭窄元素类型(如果它没有尝试这样做,您将拥有Any
元素类型 - Python 的标准列表的行为)。那么现在如何解决您的问题。
为了确保理解具有元素类型,
Function
您需要编写:另请参阅手册中的此处和此处,其中解释了如何选择理解结果的元素类型和数组文字。
如果省略前缀
Function
,则元素类型会更窄,在这种情况下,正确的子类型条件如下:(注意额外的
<:
)。此行为与以下事实有关:在 Julia 中,此类参数类型是invariant,这在Julia 手册中进行了解释。