Вложение параметров типа Юлия / Область действия в функциональных параметрах - PullRequest
0 голосов
/ 18 февраля 2019

В ответ на вопрос , который я разместил ранее , я пытаюсь понять детали области действия параметра типа в функциональных методах.
Например:

f(x::Vector{<:Number}) = sum(x)
g(x::Vector{T}) where T<:Number = sum(x)

The *Ограничение 1007 * охватывает только список аргументов f:

julia> methods(f)
f(x::Array{#s1,1} where #s1<:Number)

, но кажется, что g параметризуется им:

julia> methods(g)
g(x::Array{T,1}) where T<:Number

Есть ли причина, по которой «[y] Вы обычно хотите, чтобы T охватывал как можно меньше подписи» помимо стиля и ограничения области действия T?
Есть ли какие-либо последствия для производительности, отправка или генерация кода?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Действительно f и g выше эквивалентны, как Майкл .Вы можете динамически проверить это, написав:

julia> f(x::Vector{<:Number}) = sum(x)
f (generic function with 1 method)

julia> f(x::Vector{T}) where T<:Number = sum(x)
f (generic function with 1 method)

julia> methods(f)
# 1 method for generic function "f":
[1] f(x::Array{T,1}) where T<:Number in Main at REPL[2]:1

И Джулия говорит вам, что определение метода было перезаписано (так что оно было признано эквивалентным).

Однако в общем случае определение объемаиметь значение.См. Этот пример:

julia> f(::Vector{Vector{<:Real}}) = "inner"
f (generic function with 1 method)

julia> f(::Vector{Vector{T}}) where {T<:Real}= "outer"
f (generic function with 2 methods)

julia> f(::Any) = "all else"
f (generic function with 3 methods)

julia> methods(f)
# 3 methods for generic function "f":
[1] f(::Array{Array{#s1,1} where #s1<:Real,1}) in Main at REPL[1]:1
[2] f(::Array{Array{T,1},1}) where T<:Real in Main at REPL[2]:1
[3] f(::Any) in Main at REPL[3]:1

julia> f([[1]])
"outer"

julia> f(Vector{<:Real}[[1]])
"inner"

julia> f([Any[1]])
"all else"

Что касается производительности в нормальном (т.е. стабильном по типу) коде, Джулия выполняет статическую диспетчеризацию метода, поэтому это не должно иметь значения.Возможно, вы могли бы разработать надуманный пример, требующий сложной динамической отправки методов или генерации динамического кода, где это может иметь значение (но по практическим соображениям это не должно быть актуально - просто используйте спецификацию, соответствующую вашим потребностям).

0 голосов
/ 18 февраля 2019

Синтаксис f и g идентичен, поэтому без разницы.

...