In that case, you need traits. In fact the motivating example I gave in my JuliaCon talk on this subject last year matches yours almost exactly: https://youtu.be/j9w8oHfG1Ic
Anyway, probably you want to hand-code the Holy-traits. The example I give in my talk modified to fit your example: module M export f, Trait1, Trait2 type Trait1 end type Trait2 end # this function does the grouping: function traitfn end # now define function f which should dispatch on those traits: f(x) = _f(x, traitfn(x)) # wrapper _f(x, ::Type{Trait1}) = x.a # logic for Trait1 _f(x, ::Type{Trait2}) = x.b+1 # logic for Trait2 end using M type T1 a::Float64 end type T2 b::Float64 end # now manually add your types to Trait1 or Trait2 M.traitfn(::T1) = Trait1 M.traitfn(::T2) = Trait2 t1 = T1(1.0) t2 = T2(2.0) println(f(t1)) println(f(t2)) Note, that the packages I mention in my talk are currently not maintained but should work for Julia 0.4. But I may not have time to udate them for 0.5. On Mon, 2016-06-20 at 18:53, amik...@gmail.com wrote: > Thanks to both of you for the replies. > > Module M contains a lot of functions for the simulation of dynamical models. > Outside M, users are required to define some specific types to be consistent > with another historical project. The definition of these types should be kept > as simple as possible, this may look a bit odd, but forcing the user to define > a type T1 <: AT1 is already too much, which is why Mauro's suggestion is not > an > option for me (but thanks anyway for the proposal!). > > And the tricky thing is that T1 and T2 can't be initialized before the module, > so I can't do: > > type T1 a::Float64 end > type T2 b::Float64 end > > module M > import Main.T1, Main.T2 > function f(x::T1) return x.a end > function f(x::T2) return x.b + 1 end > export f > end > > using M > t1 = T1(1.0) > t2 = T2(2.0) > println(f(t1)) > println(f(t2)) > > which works. If there is no solution similar to the first code I proposed, I > think I'll simply use two different names such as f1(x::T1) and f2(x::T2) in > M. > But new suggestions are still highly appreciated :) > > Many thanks.