Ahh, I remember enum from the good old C++ days. That looks useful, but in reality I guess still not more user friendly than just taking a string defining the method, and then writing in the documentation that it can only have these values. I like Julia in most other ways, though in this I do think the R match.arg way is really very convenient (also because 'args(f)' will give the possible versions right at the command line). Thanks for the input!
Den tirsdag den 15. september 2015 kl. 11.19.31 UTC+2 skrev Mauro: > > Related, in Julia0.4 there is also enum: > > help?> @enum > .. @enum EnumName EnumValue1[=x] EnumValue2[=y] > > Create an :obj:`Enum` type with name ``EnumName`` and enum member values > of ``EnumValue1`` and ``EnumValue2`` with optional assigned values of ``x`` > and ``y``, respectively. ``EnumName`` can be used just like other types and > enum member values as regular values, such as > > .. doctest:: > > julia> @enum FRUIT apple=1 orange=2 kiwi=3 > > julia> f(x::FRUIT) = "I'm a FRUIT with value: $(Int(x))" > f (generic function with 1 method) > > julia> f(apple) > "I'm a FRUIT with value: 1" > > > On Tue, 2015-09-15 at 10:51, Michael Borregaard <mkborr...@gmail.com > <javascript:>> wrote: > > Thanks, both, the pattern dispatch package looks useful. I guess the > nice > > thing about having the possibilities directly in the arguments line is > that > > it is extremely easy for the user to see the legal possible values of > the > > argument. > > Best, > > Michael > > > > Den tirsdag den 15. september 2015 kl. 10.44.38 UTC+2 skrev Tomas > Lycken: > >> > >> 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> > >>> 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 > >>> > >>> > >> > >