Hi John, Thanks for the clarification, and the solution; making the provenance clear. This solutions seems safe and fine to me. However, I'm wondering (this is also in response to Ivar's reply) : the fact that both methods have different argument definitions already tells Julia that (technically) these methods can't conflict. Why would Julia care about wether the two methods are related or have the same meaning or not? Of course, when they have *exactly* the same argument definition, you know there is an ambiguity issue that Julia should act on (by not accepting any of the two methods).
Cheers, Freddy On Sunday, January 12, 2014 6:57:08 PM UTC+1, John Myles White wrote: > > Freddy, > > This is definitely one of the more confusing things about Julia, but it’s > the best current solution anyone has proposed. > > The problem with your example is that methods can only be extended to work > on new types if you make their provenance clear. In your example, you would > do something like the following: > > module A > export f > f(s::String) = "Some operation with a String"; > end > module B > A.f(b::Bool) = "Some operation with a boolean"; > end > > Absent an explicit qualification of the origin of the “f” name in module > B, Julia assumes that the f method in B is totally unrelated, which > effectively overwrites the f method in A. > > — John > > On Jan 12, 2014, at 9:48 AM, Freddy Snijder > <[email protected]<javascript:>> > wrote: > > > Hello Julia Users, > > > > I'm new to Julia and came across some behaviour of Julia, related to > methods, I didn't expect. > > > > Case A) In the REPL, when I define two methods, I get the behaviour I > expect: > > > > julia> f(s::String) = "Some operation with a String"; > > julia> f(b::Bool) = "Some operation with a boolean"; > > julia> f > > f (generic function with 2 methods) > > So far, so good. > > > > Case B) Now if I have a file with this code and load it in to a fresh > REPL session (using 'include'): > > > > module A > > export f > > f(s::String) = "Some operation with a String"; > > end > > module B > > export f > > f(b::Bool) = "Some operation with a boolean"; > > end > > then, when stating 'using A' and 'using B', I get a warning that there > is a conflict with an existing f: > > > > julia> using A > > julia> f > > f (generic function with 1 method) > > julia> using B > > Warning: using B.f in module Main conflicts with an existing identifier. > > julia> f > > f (generic function with 1 method) > > I would have expected that Julia would see this as the same method with > two different argument definitions, just like in Case A). > > I have multiple modules that define the same methods for different > composite types, which seems a normal way of working to me. > > > > What am I doing wrong? The way Julia currently handles this seems > incorrect to me ... > > > > I'm interested to hear your input! > > > > Kind regards, > > > > Freddy > > > > PS : I'm on Julia Version 0.3.0-prerelease+584 (2013-12-19 22:26 UTC), > Commit 06458fa* (2 days old master), x86_64-apple-darwin13.0.0 > > > > > >
