gpt4 book ai didi

Julia:如何将函数的参数类型定义为元组数组?

转载 作者:行者123 更新时间:2023-12-04 00:26:38 27 4
gpt4 key购买 nike

我有一个一维元组数组,我需要将其传递给定义为的函数

function f(a::Array{Tuple{Vararg{String}}, 1}) 
#do some processing
end

每个元组可以有任意数量的字符串元素,但数组中所有元组的元素数量相同。例如,数组可能看起来像 [("x1","x2"),("y1","y2")][("x1","x2", "x3"),("y1","y2","y3")] 等。因此为此使用 Vararg{String}。

现在,当我运行 f([("x1","x2"),("y1","y2")]) 时,它会抛出错误

"MethodError: no method matching f(::Array{Tuple{String,String},1})"

我应该如何修改函数定义以使其正常工作?

最佳答案

你得到这个 MethodError因为Tuple{Vararg{T}}不是具体类型,因为 Vararg 的元素数量未指定和 Julia's type parameters are invariant而不是协变

即使我们有 Tuple{Vararg{String, 5}} <: Tuple{Vararg{String}} , 我们没有 Vector{Tuple{Vararg{String, 5}}} <: Vector{Tuple{Vararg{String}}}

julia> Tuple{Vararg{String, 5}} <: Tuple{Vararg{String}}
true

julia> Vector{Tuple{Vararg{String, 5}}} <: Vector{Tuple{Vararg{String}}}
false

您应该改用以下签名来消除错误

function f(a::Vector{<:Tuple{Vararg{String}}})
# or
function f(a::Vector{T}) where {T <: Tuple{Vararg{String}}

正如@crstnbr 和@BogumiłKamiński 所建议的那样。这些签名将消除错误,但是,它们不会将元组限制为相同的长度。例如,您可以使用

调用这些函数
f([("x1, x2"), ("y1", "y2", "y3"])

由于要确保数组中的元组包含相同数量的元素,因此需要在类型注释中指定此限制。 Vararg 的文档提供有关如何指定元素数量的信息。

Vararg{T,N}

The last parameter of a tuple type Tuple can be the special type Vararg, which denotes any number of trailing elements. The type Vararg{T,N} corresponds to exactly N elements of type T. Vararg{T} corresponds to zero or more elements of type T. Vararg tuple types are used to represent the arguments accepted by varargs methods (see the section on Varargs Functions in the manual.)

你可以去

function f(a::Vector{Tuple{Vararg{String, N}}}) where N 
...
end

或使用 NTuple 的紧凑方式而是

function f(a::Vector{NTuple{N, String}}) where N

end

这些签名将执行您在问题中想要的限制。


注意事项

你可能是 overly specializing your types .

正如@Bogumił Kamiński 在评论部分指出的那样,最好使用 AbstractString键入而不是具体 String输入。

function f(a::Vector{<:NTuple{N, AbstractString}}) where N
...
end

您可以考虑使用 AbstractVector而不是 Vector ,以及。

关于Julia:如何将函数的参数类型定义为元组数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56107749/

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