moving the use of AbstractString from the types of the arguments to become a type parameter fixes baz changing AbstractString to ASCIIString without moving anything also works
zab{T<:AbstractString}(a::Vector{Tuple{T,T}}) = 4 zab(a::AbstractString) = zab([(a,a)]) zab("a") 4 zab(a::Vector{Tuple{ASCIIString, ASCIIString}}) = "four" zab(a::AbstractString) = zab([(a,a)]) zab("a") "four" On Tuesday, August 11, 2015 at 1:26:24 PM UTC-4, Seth wrote: > > Consider > > foo(a::Vector) = 1 > bar(a::Vector{Tuple}) = 2 > baz(a::Vector{Tuple{AbstractString, AbstractString}}) = 3 > > > foo(a::AbstractString) = foo([(a,a)]) > bar(a::AbstractString) = bar([(a,a)]) > baz(a::AbstractString) = baz([(a,a)]) > > Results: > > julia> foo("a") > 1 > > julia> bar("a") > ERROR: MethodError: `bar` has no method matching > bar(::Array{Tuple{ASCIIString,ASCIIString},1}) > in bar at none:1 > > julia> baz("a") > ERROR: MethodError: `bar` has no method matching > bar(::Array{Tuple{ASCIIString,ASCIIString},1}) > in baz at none:1 > > I understand why foo() works, but why do bar() or baz() both fail? >