> On Mar 16, 2017, at 8:32 PM, Robert Bennett <rltbenn...@icloud.com> wrote:
> 
> Agreed, I'm fine with a way of achieving this without T != Type. I suppose I 
> should have made the subject "Fix Swift's type checker in this particular 
> case".
> 
> I still have trouble figuring out *how* it can correctly handle ambiguity in 
> protocol extensions but be unable to in a "true" (constructible) type 
> extension. Does this warrant a bug report of some kind?

If you’re feeling adventurous, take a look at lib/Sema/CSRanking.cpp. It 
appears to have some special case logic for handling protocol extensions in 
particular.

Slava

> 
>> On Mar 16, 2017, at 11:27 PM, Slava Pestov <spes...@apple.com> wrote:
>> 
>> Overload resolution has a lot of heuristics, but it’s not magic. It simply 
>> doesn’t know how to handle this case.
>> 
>> I’d be in favor of consolidating and simplifying the overload resolution 
>> rules, with the goal of disambiguating common cases that are currently 
>> ambiguous. We might even be able to do that without breaking too much user 
>> code, since a lot of the rules there were put in place to handle specific 
>> situations that came up in the standard library.
>> 
>> However adding more heuristics to handle specific examples is a -1 from me. 
>> :-)
>> 
>> Slava
>> 
>>> On Mar 16, 2017, at 7:38 PM, Jaden Geller via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>> 
>>> I would’ve expected overload resolution to pick the “more specific” one in 
>>> this case without needing any additional constraints… 🤔
>>> 
>>>> On Mar 16, 2017, at 6:40 PM, Robert Bennett via swift-evolution 
>>>> <swift-evolution@swift.org> wrote:
>>>> 
>>>> Hello,
>>>> 
>>>> This discussion sort of fizzled out when the topic was first introduced. 
>>>> Joe Groff had asked the following:
>>>> 
>>>>> Do you have a concrete example where you need this? It'd be good to know 
>>>>> whether the types are ambiguous due to type checker bugs, or whether 
>>>>> there's a principle by which they could be naturally ordered.
>>>> 
>>>> There is an example of this ordering that I stumbled upon recently. 
>>>> Suppose I wish to extend `Array` with a `uniques()` function that returns 
>>>> an array containing the unique elements of `self`. For performance 
>>>> reasons, I would first write a method for arrays with Hashable elements, 
>>>> so that I could check for uniqueness in constant time per element.
>>>> 
>>>> extension Array where Element: Hashable {
>>>>    func uniques() -> [Element] {
>>>>            var seen: Set<Element> = []
>>>>            var uniq: [Element] = []
>>>>            
>>>>            for e in self {
>>>>                    if !seen.contains(e) {
>>>>                            seen.insert(e)
>>>>                            uniq.append(e)
>>>>                    }
>>>>            }
>>>>            
>>>>            return uniq
>>>>    }
>>>> }
>>>> 
>>>> However I would still like to have a `uniques()` method for arrays whose 
>>>> elements are merely Equatable, and I'm willing to take the performance 
>>>> cost of O(n) lookup per element.
>>>> 
>>>> extension Array where Element: Equatable {
>>>>    func uniques() -> [Element] {
>>>>            var uniq: [Element] = []
>>>>            
>>>>            for e in self {
>>>>                    if !uniq.contains(e) {
>>>>                            uniq.append(e)
>>>>                    }
>>>>            }
>>>>            
>>>>            return uniq
>>>>    }
>>>> }
>>>> 
>>>> However, there is a problem, which is that elements that are Hashable are 
>>>> also Equatable, and so there is ambiguity when calling this method:
>>>> 
>>>> // error: ambiguous use of 'uniques()'
>>>> print([1,2,3,1,2,4,5,1,2,3,4,5].uniques())
>>>> 
>>>> 
>>>> If I could add `Element != Hashable` to the second extension, there would 
>>>> be no ambiguity.
>>>> 
>>>> FWIW replacing Array with Collection and Element with Iterator.Element 
>>>> fixes the error. The first extension (the one for Hashables) is called. 
>>>> I'm not sure why it is ambiguous in one case and not the other.
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution@swift.org
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>>> 
>>> _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution@swift.org
>>> https://lists.swift.org/mailman/listinfo/swift-evolution
>> 
> 

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to