I'm not sure it's really sound (enough) to treat differently-conforming X
s as the same type, because you can't assume the importance of the conformance has been captured in any enclosing generic type's generic parameter constraints. I'll try to make an example:
// Module A
extension Array where Element: Equatable {
/// Returns true iff `self` contains any duplicate elements.
/// - Complexity: O(n^2) where n == `count`
func containsDuplicates() -> Bool { ... }
}
struct X {}
// Module B
import A
extension X: Equatable {
static func == (a: X, b: X) -> Bool {…}
}
/// Some Xs with no duplicate values, per equality as defined here.
public let uniqueXs: [X] = Array(Set( … ))
// Module C
import A
extension X: Equatable {
static func == (a: X, b: X) -> Bool {…} // Different equality
}
extension Array where Element: Equatable {
/// - Requires: `!self.containsDuplicates()`
func doSomething() { precondition(!self.containsDuplicates()) }
}
// Module D
import A
import B
import C
print(B.uniqueXs.containsDuplicates()) // true?
B.uniqueXs.doSomething() // crash?