Until we get "diagonal dispatch," I think the only way to do this is to expand 
the number of arguments in the function:

myfunc(vec::Vector) = _myfunc(eltype(vec), vec)  # internal function
_myfunc{D<:Dict{ASCIIString}}(::Type{D}, vec) = 1
_myfunc{D}(::Type{D}, vec) = 2

julia> myfunc([Dict("a"=>1), Dict("b"=>1.0)])
1

julia> myfunc([Dict(1=>:hello), Dict(2=>:world)])
2

Best,
--Tim

On Thursday, July 14, 2016 1:05:20 PM CDT Yichao Yu wrote:
> On Thu, Jul 14, 2016 at 12:41 PM, David Barton <dawbar...@gmail.com> wrote:
> > Hi,
> > 
> > I'm trying to write a function that accepts a vector of values that are of
> > the same (overall) type but with different parameterisations. As a simple
> > example, consider the vector = [Dict("a"=>1), Dict("b"=>1.0)]. I can
> > easily
> > use a function along the lines of
> > 
> > function myfunc(vec::Vector{Dict})
> > 
> >   # do something
> > 
> > end
> > 
> > but I'd like to be able to restrict the parameterisation slightly so that
> > the first parameter of the Dict type is an ASCIIString (not my actual use
> > case but follows exactly the same pattern). I've tried doing something
> > like
> > 
> > function myfunc{T}(vec::Vector{Dict{ASCIIString, T}})
> > 
> >   # do something
> > 
> > end
> > 
> > but this seems to enforce the condition that all the Dicts in the vector
> > have the same parametric type T (so my example of myfunc([Dict("a"=>1),
> > Dict("b"=>1.0)]) fails). Is there any way of expressing this constraint?
> > Or
> 
> The issue is the type of `[Dict("a"=>1), Dict("b"=>1.0)]` It has type
> `Vector{Dict{String}}` which cannot be matched by the signature you
> provide. I'm not sure if there's currently a clean way to be able to
> match this type in additional to the more strict types.
> 
> > will I just have to use the first form of myfunc with some extra checking
> > in the function body?
> > 
> > Thanks
> > David


Reply via email to