You could also use a fairly common (although it is discouraged in the style 
guide 
<http://docs.julialang.org/en/release-0.4/manual/style-guide/?highlight=style#avoid-confusion-about-whether-something-is-an-instance-or-a-type>)
 
construct with an “enum type tree”:

abstract SolverMethod
immutable Spearman end
immutable Pearson end
immutable Kendall end

Now, you can define and use your function definition like this:

function foo{Method<:SolverMethod}(x, method::Type{Method})
    ...
end

foo(x, Kendall) # solve using Kendall solver

Furthermore, you can leverage multiple dispatch for parts of the function 
that differ based on the solver method. Inside foo, this

if method == "spearman"
    # do spearman specific stuff
elseif method == "pearson"
    # do pearson specific stuff
elseif method == "kendall"
    # do kendall specific stuff
else
    # handle incorrect input
end

turns into

dostuff(..., method)

# and outside of foo
function dostuff(..., ::Type{Spearman})
    # do spearman specific stuff
end
function dostuff(..., ::Type{Pearson})
    # do pearson specific stuff
end
function dostuff(..., ::Type{Kendall})
   # do kendall specific stuff
end

//T

On Tuesday, September 15, 2015 at 10:32:39 AM UTC+2, Mauro wrote:

No, Julia only dispatches on types not on values.  The latter sometimes 
> goes under the name of pattern matching.  There is a package for that: 
> https://github.com/toivoh/PatternDispatch.jl 
>
> On Tue, 2015-09-15 at 10:15, Michael Borregaard <mkborr...@gmail.com 
> <javascript:>> wrote: 
> > Is there a way in julia to restrict the values of arguments to a 
> function, 
> > eg to the contents of a certain vector? 
> > 
> > So, e.g. method in the function 
> > 
> > function foo(x, method::String) ... 
> > 
> > would be constrained to either "spearman", "pearson" or "kendall"? 
> > 
> > Thanks 
>
> ​

Reply via email to