Ok, it makes sense. I do think that supporting something like this might make the proposal even more appealing as it will bring custom types somewhat closer to builtin types by allowing generic functions/methods that can act on both at the same time.
On Fri, Aug 2, 2019 at 1:28 PM Ian Lance Taylor <i...@golang.org> wrote: > On Fri, Aug 2, 2019 at 1:12 PM Bruno Albuquerque <b...@gmail.com> wrote: > > > > I was thinking about a way to "extend" usual operations (say, equality > checks) to types that can not be compared the usual way (they are not > "comparable" in the contract sense) and came up with something like this: > > > > // Just to use for type assertion later. > > type Equaler interface { > > Equal(Equaler) bool > > } > > > > contract Comparable(T) { > > T comparable(T), Equal(T) bool > > } > > > > func Compare(type T Comparable)(a, b T) bool { > > if eq, ok := a.(Equaler); ok { > > return eq.Equal(b) > > } > > > > return a == b // Does this work at all? > > } > > > > Would this work? More specifically it looks to me that that if the > specific type is not comparable (But has the Equal method), the compiler > might see the "==" comparison in the function and give an error. > > > > One way around this would possibly be to use something similar to type > assertion (in this case, a and b would have to be asserted to "comparable" > which I guess is not possible as it is a contract). Or, the compiler could > be smart enough to know that if we reached that check, then the type must > be comparable (so it would also not give an error). > > In the current design draft, that would not work. The == operator is > not supported by all possible types, so it is not permitted. > > We definitely don't want to rely on the compiler being smart enough. > Any such approach would require writing down the exact inference rules > that the compiler is permitted to use. Otherwise different compilers > would behave differently. > > One possibility we've toyed with is > > switch T.(type) { // Note: switch on type parameter itself, not a > value of that type. > case Equaler: > ... > case comparable: > // Permit using == operator here on values of type T in this case > only. > } > > We'll see whether some such facility seems useful. This is something > we can add later, if the current design draft seems workable. > > Ian > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CAEd86Tz4tvx3qPZ4fV86AyV-B8YOXEMZMR-L4f6fcTyAuX_eXQ%40mail.gmail.com.