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