The answer to your first question is easy. subtypes() only display the 
direct subtypes. ASCIIString is a subtype of DirectIndexString, which in 
turn is a subtype of String

julia> subtypes(String)
8-element Array{Any,1}:
 Base.GenericString          
 DirectIndexString           
 RepString                   
 RevString{T<:AbstractString}
 RopeString                  
 SubString{T<:AbstractString}
 UTF16String                 
 UTF8String                  

julia> subtypes(DirectIndexString)
2-element Array{Any,1}:
 ASCIIString
 UTF32String

The answer to your second question is more contentious, though a valid 
answer might be that this is simply a design choice. A generic discussion 
is here: 
http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29
 
and there are various discussions in the mailing list about why this choice 
has been made in Julia. 

Regards
-
Avik

On Wednesday, 22 April 2015 18:20:46 UTC+1, Test This wrote:
>
> Avik and Patrick,
>
> Thanks to both of you for clarifying this and for the alternative. 
>
> I have a couple of related questions:
>
> - Why is ASCIIString not listed when I do subtypes(String)?
> - Why is Dict{ASCIIString, Int} not a subtype of Dict{String, Int}, if 
> ASCIIString is a subtype of String?
>
> Anyhow, for now, your answers and links are very helpful.
>
>
>
>
> On Wednesday, April 22, 2015 at 10:38:27 AM UTC-4, Patrick O'Leary wrote:
>>
>> (The crusade continues)
>>
>> Never fear though, this doesn't mean you have to write more code! Julia 
>> supports the use of type variables to express generics. So in your case, 
>> instead of:
>>
>> function func(a::Params, b::String, c::Dict{String, Array{Int, 1}}, 
>> d::Dict{String, Array{Int, 1}})
>>   ...
>> end
>>
>> which has the aforementioned invariance problem, you can write
>>
>> function func{T<:String}(a::Params, b::T, c::Dict{T, Array{Int, 1}}, 
>> d::Dict{T, Array{Int, 1}})
>>   ...
>> end
>>
>> which defines a family of methods for any subtype of String. These 
>> methods are called, in Julia terms, "parametric methods", and are discussed 
>> in the manual here: 
>> http://docs.julialang.org/en/release-0.3/manual/methods/#parametric-methods
>>
>> Hope this helps,
>> Patrick
>>
>>
>> On Wednesday, April 22, 2015 at 8:54:12 AM UTC-5, Avik Sengupta wrote:
>>>
>>> So a one line answer to this is julia container types are invariant. 
>>>
>>> Lets take this step by step
>>>
>>> julia> f(x::String) = "I am $x"
>>> f (generic function with 2 methods)
>>>
>>> julia> f("abc")
>>> "I am abc"
>>>
>>> julia> g(x::Dict) = "I am a dict of type: $(typeof(x))"
>>> g (generic function with 1 method)
>>>
>>> julia> g(Dict("abc"=>1))
>>> "I am a dict of type: Dict{ASCIIString,Int64}"
>>>
>>> julia> h(x::Dict{String, Int}) = "I am a dict of {String=>Int}"
>>> h (generic function with 1 method)
>>>
>>> julia> h(Dict("abc"=>1))
>>> ERROR: MethodError: `h` has no method matching 
>>> h(::Dict{ASCIIString,Int64})
>>>
>>>
>>> Basically, while an "ASCIIString" is a subtype of the abstract type 
>>> "String" , a Dict{ASCIIString, Int} is not a subtype of Dict{String, Int}
>>>
>>> See here for more: 
>>> http://docs.julialang.org/en/release-0.3/manual/types/?highlight=contravariant#man-parametric-types
>>>
>>> Regards
>>> -
>>> Avik
>>>
>>> On Wednesday, 22 April 2015 14:14:06 UTC+1, Test This wrote:
>>>>
>>>>
>>>> I defined a function 
>>>>
>>>> function func(a::Params, b::String, c::Dict{String, Array{Int, 1}}, 
>>>> d::Dict{String, Array{Int, 1}})
>>>>   ...
>>>> end
>>>>
>>>> When I run the program, calling this function with func(paramvalue, 
>>>> "H", d1, d2), I get an error saying func has no method matching
>>>> (::Params, ::ASCIIString, ::Dict{ASCIIString,Array{Int64,1}}, 
>>>> ::Dict{ASCIIString,Array{Int64,1}})
>>>>
>>>> The code works if I change String to ASCIIString in the function 
>>>> definition. But I thought (and the REPL seems to agree) that 
>>>> any value of type ASCIIString is also of type String. Then, why am I 
>>>> getting this error. 
>>>>
>>>> Thanks in advance for your help.
>>>>
>>>

Reply via email to