gpt4 book ai didi

Julia:具有抽象参数的数组会导致错误,但具有抽象类型的变量不会

转载 作者:行者123 更新时间:2023-12-03 22:31:24 25 4
gpt4 key购买 nike

Julia style guide说如下:

Don’t use unnecessary static parameters. A function signature:

foo{T<:Real}(x::T) = ...

should be written as:

foo(x::Real) = ...


我希望这也适用于数组参数。但是,如果我编写以下代码:
ret1(x::Real) = x
ret2(x::Array{Float64,2}) = x
ret3(x::Array{Real,2}) = x
ret1(1.0)
ret2(rand(2,2))
ret3(rand(2,2))

然后我得到以下控制台输出(使用 Julia 0.2.1):
MethodError(ret3,(
2x2 Array{Float64,2}:
0.841121 0.322133
0.469432 0.495438,))

那么为什么 Julia 会为带有抽象类型参数的数组抛出错误,而不会为带有抽象类型的变量抛出错误呢?

最佳答案

ret3的情况下,类型参数实际上是必需的,因为 Array{Real}是一种永远无法构造的类型 Julia 的类型参数是不变的。这是一个有点微妙的话题,但关键事实是,虽然 Float64 <: Real是真的,Array{Float64} <: Array{Real}不是。起初这有点令人困惑,但这是编译器在进行代码生成时能够知道函数参数的内存布局所必需的。见 manual有关更多信息。

所以你可以通过 Real 调度如 ret1因为当你传递它时 Float64 , Float64 <: Real是真的,而在 ret3你正在传递一个 Array{Float64} , 和 Array{Float64} <: Array{Real}情况并非如此,因此没有方法错误。要解决此问题,请使用类型参数:

julia> ret3{T <: Real}(x::Array{T,2}) = x
ret3 (generic function with 2 methods)

julia> ret3(rand(2,2))
2x2 Array{Float64,2}:
0.0857132 0.353194
0.802737 0.717292

关于Julia:具有抽象参数的数组会导致错误,但具有抽象类型的变量不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23326848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com