Julia 将Varargs输入与一个固定类型的元素配对

Julia 将Varargs输入与一个固定类型的元素配对,julia,Julia,我可以构建以下内容: foo(p::Pair...) = dostuff foo{N}(p::Pair{Symbol,N}...) = dostuff 这将适用于成对的列表。我想做以下工作: foo(p::Pair...) = dostuff foo{N}(p::Pair{Symbol,N}...) = dostuff 其中,每对的第一个条目是符号,但第二个条目不受约束。上述构造要求所有第二个条目的类型相同,但我希望允许任何第二个条目: foo(:a=>1, :b=>"hi"

我可以构建以下内容:

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

foo(p::Pair...) = dostuff
foo{N}(p::Pair{Symbol,N}...) = dostuff
其中,每对的第一个条目是符号,但第二个条目不受约束。上述构造要求所有第二个条目的类型相同,但我希望允许任何第二个条目:

foo(:a=>1, :b=>"hi")
有办法做到这一点吗?
我是否需要使用第一个版本,在函数本身中强制参数类型并抛出错误?

因为带有未指定尾随类型参数的参数类型被视为抽象超类型,与指定类型匹配,因此类型
对{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>foo(:a=>1.5,:b=>x)
“来自符号的对”
朱莉娅>福(1.5=>:a,“x”=>:b)
“配对到符号”
朱莉娅>福(:a=>:b,:c=>:d)
错误:MethodError:foo(::对{Symbol,Symbol},::对{Symbol,Symbol})不明确。候选人:
foo(p::Pair{A