Posso criar uma função anônima dentro de uma compreensão de lista em Julia. Espero que isso crie um tipo de Vector{Function}
. Em vez disso, o tipo é algo como Vector{var"#2#4"}
.
Por exemplo, ao envolver um escopo externo com uma função anônima
typeof(x->x) <: Function # true
a = 1
typeof(x-> x + a) <: Function # false
enquanto
f(x) = x
typeof(f) <: Function # true
a = 1
g(x) = x + a
typeof(g) <: Function # true
Por que a função anônima é digitada de maneira diferente da função regular quando o escopo externo está envolvido?
Agora, em uma compreensão de lista:
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
se o índice i
está ou não envolvido. Eu inicialmente esperava true
em cada caso.
Primeiro observe que seu exemplo inicial não está correto, pois você:
Portanto, ambas as funções anônimas têm um tipo que é um subtipo de
Function
.Agora, quanto à compreensão, observe que isso não está relacionado com a presença do parâmetro, como você tem:
A razão para esse comportamento é quando você escreve algo como
[...]
Julia escolhe um tipo de elemento restrito da compreensão (se não tentasse fazer isso, você teria oAny
tipo de elemento - o comportamento que o Python tem para suas listas padrão).Então agora como resolver seu problema.
Para ter certeza de que a compreensão possui o tipo de elemento,
Function
você precisa escrever:Veja também aqui e aqui no manual onde explica como o tipo de elemento para um resultado de uma compreensão e um literal de array é escolhido.
Se você omitir o
Function
prefixo, o tipo de elemento será mais restrito e, neste caso, a condição de subtipagem adequada seria a seguinte:(observe o extra
<:
).Esse comportamento está relacionado ao fato de no Julia tais tipos paramétricos serem invariantes , o que é explicado aqui no manual do Julia.