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