[Swift-devel] Reconsidering function overloading
Mihael Hategan
hategan at mcs.anl.gov
Wed Jan 28 14:39:50 CST 2015
Which ultimately isn't much different from having to do:
(float x) minFloat(float[] a) {
x = min(a);
}
reduce(a, minFloat);
So maybe that isn't much progress.
Mihael
On Wed, 2015-01-28 at 12:23 -0800, Mihael Hategan wrote:
> Here's another idea. If we do support lambda expressions, then:
>
> - a direct reference to an overloaded function when no parameter type is
> available should result in an ambiguity error
> - a user can resolve the issue by writing an explicit lambda expression
> which calls the overloaded function, but this time with normal parameter
> type information available
>
> E.g:
>
> min = reduce(a, min); // error
> min = reduce(a, lambda(float x) { return min(x); });
>
> This requires no specialized casting mechanism. Of course, if lambda
> expressions weren't in the plans, this might be more work.
>
> Mihael
>
> On Tue, 2015-01-27 at 21:42 -0600, 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
>
>
> _______________________________________________
> Swift-devel mailing list
> Swift-devel at ci.uchicago.edu
> https://lists.ci.uchicago.edu/cgi-bin/mailman/listinfo/swift-devel
More information about the Swift-devel
mailing list