gpt4 book ai didi

julia - 将可变参数输入与一个固定类型的元素配对

转载 作者:行者123 更新时间:2023-12-05 00:55:31 25 4
gpt4 key购买 nike

我可以构建以下内容:

foo(p::Pair...) = dostuff

这将适用于对列表。我想做以下事情:
foo{N}(p::Pair{Symbol,N}...) = dostuff

其中每对的第一个条目是一个符号,但第二个条目不受约束。上面的构造要求所有第二个条目都是相同类型的,但我想允许任何第二个条目:
foo(:a=>1, :b=>"hi")

有没有办法做到这一点?
我是否需要使用第一个版本并在函数本身中强制执行参数类型并抛出错误?

最佳答案

由于具有未指定尾随类型参数的参数类型被视为抽象父类(super class)型,匹配指定类型,类型 Pair{Symbol}匹配第一个参数为 Symbol 的任何对带有任何第二个参数。因此,您可以像这样编写您想要的方法签名:

foo(p::Pair{Symbol}...) = "pairs from symbols"

如果您想调度第二个类型参数而不是第一个,这将无济于事。为此,您需要一个类型别名:
typealias Riap{B,A} Pair{A,B}

foo(p::Riap{Symbol}...) = "pairs to symbols"

我们可以看到这两种方法在起作用:
julia> foo(:a => 1.5, :b => "x")
"pairs from symbols"

julia> foo(1.5 => :a, "x" => :b)
"pairs to symbols"

julia> foo(:a => :b, :c => :d)
ERROR: MethodError: foo(::Pair{Symbol,Symbol}, ::Pair{Symbol,Symbol}) is ambiguous. Candidates:
foo(p::Pair{A<:Any,Symbol}...) at REPL[5]:1
foo(p::Pair{Symbol,B<:Any}...) at REPL[1]:1
in eval(::Module, ::Any) at ./boot.jl:231
in macro expansion at ./REPL.jl:92 [inlined]
in (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at ./event.jl:46

julia> foo()
ERROR: MethodError: foo( is ambiguous. Candidates:
foo(p::Pair{A<:Any,Symbol}...) at REPL[5]:1
foo(p::Pair{Symbol,B<:Any}...) at REPL[1]:1
in eval(::Module, ::Any) at ./boot.jl:231
in macro expansion at ./REPL.jl:92 [inlined]
in (::Base.REPL.##1#2{Base.REPL.REPLBackend})() at ./event.jl:46

关于julia - 将可变参数输入与一个固定类型的元素配对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37973264/

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