> On Feb 22, 2017, at 8:47 AM, David Sweeris via swift-evolution > <[email protected]> wrote: > > >> On Feb 22, 2017, at 8:01 AM, Ben Cohen via swift-evolution >> <[email protected] <mailto:[email protected]>> wrote: >> >> There is another option to avoid the extra types, which is to stop trying to >> force the disambiguation through argument labels, accept an ambiguous call >> and have the context disambiguate: >> >> // compilation error: ambiguous >> let x = i.multiplied(by: j) >> // unambiguously overflow-checked >> let (y,overflow) = i.multiplied(by: j) >> // unambiguously full-width >> let z: DoubleWidth = i.multiplied(by: j) >> >> Ambiguity is bad when you want to distinguish between the “usual one” versus >> other more specialized versions. So if you really had a regular trapping >> `adding`, but then also wanted to accommodate the overflow-reporting version >> when a user explicitly requests it, then the argument label is a clear win. >> This is a slightly bogus example though, because we explicitly don’t have >> things like `adding`, we have a `static +` instead. Where the disambiguation >> is needed is instead between two less common variants as described above. > > It’d need a new language feature to support it, but what having “default” > resolutions for overloaded functions? > default func multiplied(by other: Self) -> Self // `default` means try > resolving ambiguities with this version first. The overloaded versions are > only considered if the type-checker can’t make this version work.
This feature is not strictly required in this case, as we moved away from using `multiplied` of type (Self, Self) -> Self to using proper `static func +`. So the ambiguity will *not* happen in the most common case when you want to multiply two numbers of some type and get the result of the same type. Ambiguity will only become a problem in what I believe to be a very less frequent case, when you want to do something very special, like, catch the overflow explicitly or get the full result in a form of DoubleWidth<T>. > func multiplied(by other: Self) -> (partialValue: Self, overflow: > ArithmeticOverflow) > func multiplied(by other: Self) -> DoubleWidth<Self> > > // signature matches default implementation, use that > let x = i.multiplied(by: j) > // default version doesn’t return a tuple, so try the overloads… matches the > overflow-checked function > let (y,overflow) = i.multiplied(by: j) > // default version doesn’t return a DoubleWidth, so try the overloads… > matches the double-width function > let z: DoubleWidth = i.multiplied(by: j) > > - Dave Sweeris > _______________________________________________ > swift-evolution mailing list > [email protected] > https://lists.swift.org/mailman/listinfo/swift-evolution
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
