On Wed, 2015-08-12 at 17:28, Cedric St-Jean <[email protected]> wrote:
> On Wednesday, August 12, 2015 at 12:15:19 AM UTC-4, Stefan Karpinski wrote:
>>
>> You can't create a value whose concrete type is Tuple{AbstractString, 
>> AbstractString} but you can create values that are of that type and you can 
>> create an instance of Vector{Tuple{AbstractString, AbstractString}}:
>>
>> julia> baz(a::Vector{Tuple{AbstractString, AbstractString}}) = 3
>> baz (generic function with 1 method)
>>
>> julia> baz(Vector{Tuple{AbstractString,AbstractString}}())
>> 3
>>
>>
>>
> Interesting. Does that really work in 0.4? I tried to replicate in 0.3 with 
>
> Vector{(AbstractMatrix,AbstractMatrix)}()
>> type cannot be constructed

A bit confusingly arrays are not constructed like that:

julia> Vector{Int}()
ERROR: type cannot be constructed

Instead:

julia> (AbstractMatrix,AbstractMatrix)[]
0-element Array{(AbstractArray{T,2},AbstractArray{T,2}),1}

> What kind of object is a Vector{Tuple{AbstractString,AbstractString}}()? 
> Does it have memory allocated to it? What is that construction good for?

It can hold any tuple t for which isa(t, (AbstractMatrix,AbstractMatrix)) is 
true.  For instance:

julia> push!(a, ([1,2]', speye(3)))
1-element Array{(AbstractArray{T,2},AbstractArray{T,2}),1}:
 (
1x2 Array{Int64,2}:
 1  2,

3x3 sparse matrix with 3 Float64 entries:
        [1, 1]  =  1.0
        [2, 2]  =  1.0
        [3, 3]  =  1.0)


Under the hood it is an array of pointers pointing to its entries.

> Cédric
>  
>
>>
>>
>> On Wed, Aug 12, 2015 at 12:09 AM, Cedric St-Jean <[email protected] 
>> <javascript:>> wrote:
>>
>>> Is it correct to say that:
>>>
>>> baz(a::Vector{Tuple{AbstractString, AbstractString}}) = 3
>>>
>>> is uncallable, since we can't instantiate an AbstractString? Maybe it 
>>> should trigger an error/warning on definition.
>>>
>>> Cédric
>>>
>>> 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?
>>>>>>>
>>>>>>
>>>>>>
>>>>
>>

Reply via email to