On Wed, Aug 12, 2015 at 8:14 AM, David Gold <[email protected]> wrote: > @Stefan, > > I'd have thought that parametric types being invariant in typevars would > lead to > > !(Tuple{ASCIIString, ASCIIString} <: Tuple{String, String}) > > just as > > !(Vector{ASCIIString} <: Vector{String}) > > Tuples seem to behave specially?
Yes, they are. See the "key differences" about covariant[1] [1] http://julia.readthedocs.org/en/latest/manual/types/#tuple-types > > On Tuesday, August 11, 2015 at 4:18:38 PM UTC-4, Stefan Karpinski wrote: >> >> Same thing – even though >> >> Tuple{ASCIIString,ASCIIString} <: Tuple{String,String} <: Tuple >> >> >> due to invariance, we still have these: >> >> !(Vector{Tuple{String,String}} <: Vector{Tuple}) >> >> !(Vector{Tuple{ASCIIString,ASCIIString}} <: Vector{Tuple}) >> !(Vector{Tuple{ASCIIString,ASCIIString}} <: Vector{Tuple{String,String}}) >> >> >> On Tue, Aug 11, 2015 at 4:13 PM, Seth <[email protected]> wrote: >>> >>> Thanks, Stefan. I understand that causing the problem for baz(), but why >>> does this explain bar()'s failure? >>> >>> On Tuesday, August 11, 2015 at 1:10:27 PM UTC-7, Stefan Karpinski wrote: >>>> >>>> Parametric typing in Julia is invariant, so >>>> >>>> !(Vector{Tuple{ASCIIString,ASCIIString}} <: >>>> Vector{Tuple{String,String}}) >>>> >>>> >>>> even though >>>> >>>> Tuple{ASCIIString,ASCIIString} <: Tuple{String,String}. >>>> >>>> >>>> See: >>>> http://docs.julialang.org/en/release-0.3/manual/types/#parametric-composite-types >>>> >>>> On Tue, Aug 11, 2015 at 1:26 PM, Seth <[email protected]> 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? >>>> >>>> >> >
