[Swift-devel] Reconsidering function overloading

Michael Wilde wilde at anl.gov
Wed Jan 28 07:07:49 CST 2015


I think #1 is reasonable.

I don't think #3 is in practice that bad, though.

Another variation on #3 is:

6. Ban using function references as arguments/returns in overloaded 
functions (for now).

Note that Apple's Swift makes heavy use of type inference. It might be 
useful to see how it handles this issue.

An advantage to #1 is that we could add support for overloading at a 
later time.

A point in favor of #3 or #6 is that we've lived without either feature 
till now; a few restrictions on the pair of new features will not be 
very limiting. I don't think it will lead to many "bad programmer 
experiences", although I agree that its a wart from a language design 
perspective.

- Mike

On 1/27/15 9:42 PM, Tim Armstrong wrote:
> Hi All,
>   I was just starting to look at implementing the function overloading 
> support required by the current design of the standard library.  I've 
> just realised some of the complications and wanted to reassess the 
> current design.
>
> .As soon as I looked at the changes needed, it was obvious that it 
> interacts with function references in ways that are probably 
> undesirable.  The issue is that a function name maps to more than one 
> function, and the compiler needs to be able to disambiguate wherever 
> it is used: in a variable context as well as a function call context.
>
> For example, suppose we wanted to provide a reduce function with type 
> reduce(T, T[], (T) f (T, T)).  It seems reasonable that we'd want to 
> be able to write:
>
> reduce(0, [1, 10, 3, 4], max)
>
> But if max is overloaded, then we have to be able to infer from the 
> type of the first and second arguments which max was meant.
>
> As an aside, there's a further level of difficulty in resolving things 
> correctly if you consider that overloaded functions can take 
> overloaded functions as arguments
>
> There seems to be a number of ways to get around this problem:
> 1. Don't support overloading at all, save complications at the expense 
> of longer function names
> 2. Don't plan on supporting function references at all
> 3. Ban using overloaded functions as first-class functions, force 
> users to work around it.
> 4. Attempt to do some basic type inference to disambiguate, give up if 
> we can't disambiguate from local information. (C++ approach, essentially)
> 5. Full program-wide type inference (Haskell approach)
>
> #2 doesn't fit with overall plans for the project, I don't think. #3 
> seems pretty unsatisfying and I think we're best to avoid bad 
> programmer experiences when we have a cleanish slate to work from.   
> #5 doesn't seem feasible without major changes to language and compiler.
> This leaves #1 and #4.  I think I could make #4 work in Swift/T, but 
> it would be days of work and getting all the corner cases may be a 
> challenge - realistically I might just not get it done.  I have no 
> idea how feasible #4 is in Swift/K. #1 seems like the best effort to 
> reward ratio to me.
>
> Anyway, that was a bunch of detail - does anyone have any thoughts or 
> opinions?  Have I missed anything?
>
> I'm already assuming that we just shouldn't support overloading 
> functions with any other kind of polymorphic arguments - it's not 
> really necessary and too complicated to implement
>
> - Tim
>
>
> _______________________________________________
> Swift-devel mailing list
> Swift-devel at ci.uchicago.edu
> https://lists.ci.uchicago.edu/cgi-bin/mailman/listinfo/swift-devel

-- 
Michael Wilde
Mathematics and Computer Science          Computation Institute
Argonne National Laboratory               The University of Chicago

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/swift-devel/attachments/20150128/c7a930cf/attachment.html>


More information about the Swift-devel mailing list