Julia 中函数参数的类型声明可以是数组和标量
Type declaration in Julia for function argument that can be both array and scalar
我应该在 Julia 中为可以是标量或数组的函数参数指定什么类型?例如,在下面的函数中 x
和 y
可以是例如Float64
或 Array{Float64}
.
function myfun(x, y)
return x .+ y
end
这些变量是否有适当的类型声明?还是我应该避免在那里声明类型(或编写通用函数)?
您可以安全地避免指定类型。这不会对您的代码的性能产生影响。
但是,如果您想明确指定您提供的类型限制(这对于确保使用正确的参数调用函数非常有用,如果不正确则快速失败):
function myfun(x::Union{Float64, Array{Float64}},
y::Union{Float64, Array{Float64}})
return x .+ y
end
但是,您很可能更想要以下签名:
function myfun(x::Union{AbstractFloat, AbstractArray{<:AbstractFloat}},
y::Union{AbstractFloat, AbstractArray{<:AbstractFloat}})
return x .+ y
end
表示您接受任何标量浮点数或任何浮点数数组(不一定只有 Float64
和 Array
)。这更灵活,例如如果您希望切换计算精度,则可以接受视图或其他浮点数(BigFloat
或 Float32
)。这样的签名清楚地告诉您的用户您希望他们将什么类型的输入传递给 myfun
同时保持灵活性。
我建议这个限制过度 (Union{Float64, Array{Float64}}
),虽然被编译器接受,但通常会在以后开始使用具有各种输入类型的函数时导致问题。
我应该在 Julia 中为可以是标量或数组的函数参数指定什么类型?例如,在下面的函数中 x
和 y
可以是例如Float64
或 Array{Float64}
.
function myfun(x, y)
return x .+ y
end
这些变量是否有适当的类型声明?还是我应该避免在那里声明类型(或编写通用函数)?
您可以安全地避免指定类型。这不会对您的代码的性能产生影响。
但是,如果您想明确指定您提供的类型限制(这对于确保使用正确的参数调用函数非常有用,如果不正确则快速失败):
function myfun(x::Union{Float64, Array{Float64}},
y::Union{Float64, Array{Float64}})
return x .+ y
end
但是,您很可能更想要以下签名:
function myfun(x::Union{AbstractFloat, AbstractArray{<:AbstractFloat}},
y::Union{AbstractFloat, AbstractArray{<:AbstractFloat}})
return x .+ y
end
表示您接受任何标量浮点数或任何浮点数数组(不一定只有 Float64
和 Array
)。这更灵活,例如如果您希望切换计算精度,则可以接受视图或其他浮点数(BigFloat
或 Float32
)。这样的签名清楚地告诉您的用户您希望他们将什么类型的输入传递给 myfun
同时保持灵活性。
我建议这个限制过度 (Union{Float64, Array{Float64}}
),虽然被编译器接受,但通常会在以后开始使用具有各种输入类型的函数时导致问题。