gpt4 book ai didi

julia - 为什么联合类型不接受 Julia 中的其中一种类型?

转载 作者:行者123 更新时间:2023-12-02 17:59:55 26 4
gpt4 key购买 nike

为什么联合类型 Array{Union{Missing, Float64},1} 不接受 Array{Float64,1}

function somefn(; serie::Vector{Union{Missing, Float64}})
end
serie = [1.0, 2.0, 1.0, 4.0]
somefn(serie = serie)


ERROR: TypeError: in keyword argument serie, expected Array{Union{Missing, Float64},1}, got Array{Float64,1}
Stacktrace:
[1] (::var"#kw##somefn")(::NamedTuple{(:serie,),Tuple{Array{Float64,1}}}, ::typeof(somefn)) at ./none:0
[2] top-level scope at REPL[12]:1

解决此问题的一种方法是从函数签名中删除 Vector{Union{Missing, Float64}} ,我不想这样做,我想显式限制函数参数的可能类型减少错误并更容易理解函数的工作原理。

最佳答案

原因在 Julia 手册的 Parametric Composite Types 部分中有解释。 .

简而言之,在 Julia 类型中,除了元组是不变的。引用文档:

This last point is very important: even though Float64 <: Real we DO NOT have Point{Float64} <: Point{Real}.

修复代码使其正常工作的方法是编写以下任一内容:

function somefn(; serie::Vector{<:Union{Missing, Float64}})
end

function somefn(; serie::Vector{T}) where {T<:Union{Missing, Float64}}
end

稍后将在手册的该部分中对此进行解释。

要理解的关键是 Vector{<:Union{Missing, Float64}}匹配参数为 Union{Missing, Float64} 子类型的所有类型,而在Vector{Union{Missing, Float64}}中该参数必须匹配Union{Missing, Float64}完全正确。

因此,在您的原始代码示例中进行以下调用:

somefn(serie = Union{Float64,Missing}[1,2,3])

可以作为类型参数匹配。

关于julia - 为什么联合类型不接受 Julia 中的其中一种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59798109/

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