Pair is a parametric type, and in Julia these are invariant,
meaning element subtyping does not imply pair subtyping.
In your case, the pair elements are subtypes:
Tuple{Function,Int,Int,Int} <: Tuple{Function,Vararg{Int}} # true
Int <: Int # true
but the Pair is not:
Pair{Tuple{Function,Int,Int,Int}, Int} <: Pair{Tuple{Function,Vararg{Int}},
Int} # false
On Wednesday, April 6, 2016 at 4:51:39 AM UTC+10, Seth wrote:
> Hi all,
>
> I have the following on 0.4.6-pre+18:
>
> z = [Pair((+,1,5,7), 3), Pair((-,6,5,3,5,8), 1)]
> type Foo
> x::Array{Pair{Tuple{Function, Vararg{Int}}, Int}}
> end
>
>
> and I'm getting
>
> julia> Foo(z)
> ERROR: MethodError: `convert` has no method matching
> convert(::Type{Pair{Tuple{Function,Vararg{Int64}},Int64}},
> ::Pair{Tuple{Function,Int64,Int64,Int64},Int64})
> This may have arisen from a call to the constructor
> Pair{Tuple{Function,Vararg{Int64}},Int64}(...),
> since type constructors fall back to convert methods.
> Closest candidates are:
> Pair{A,B}(::Any, ::Any)
> call{T}(::Type{T}, ::Any)
> convert{T}(::Type{T}, ::T)
> in copy! at abstractarray.jl:310
> in call at none:2
>
>
> It's probably a stupid oversight, but I'm stuck. Can someone point me to
> the error?
>