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.
>>>
>>