Are the followings also intended? func Foo[T any](T T) T { // (the 2nd) T redeclared in this block return T // T (type) is not an expression }
func Bar[T any](x T) T { var T = x // T redeclared in this block return T } On Fri, Nov 12, 2021 at 6:03 PM Axel Wagner <axel.wagner...@googlemail.com> wrote: > > > On Fri, Nov 12, 2021 at 10:54 AM tapi...@gmail.com <tapir....@gmail.com> > wrote: > >> >> >> On Friday, November 12, 2021 at 5:33:19 PM UTC+8 >> axel.wa...@googlemail.com wrote: >> >>> I suspect this issue is hard/impossible to avoid, because it must be >>> possible to self- and mutually reference type-parameters, in a way that >>> it's not for normal parameters, to allow to write something like >>> >>> type Equaler[T any] interface { >>> Equal(T) bool >>> } >>> func Eq[T Equaler[T]](a, b T) bool { >>> return a.Equal(b) >>> } >>> >> >> I don't see the same problem here. "T" and "Equaler" are two different >> identifiers. >> > > But T and T are not. > > The point I was making is that type-parameters must inherently be scoped > in a way that makes them visible in the type-list itself, to make writing > code like this possible. This isn't necessary for regular parameters and > it's what makes type-parameter lists special. > > I *also* said that it's probably possible to devise rules which would make > this possible, while allowing the example you wrote, just that those rules > would have to be complicated. > > >> >> >>> >>> or basically any use-case for constraint-type inference. >>> >>> Even if we *could* allow it consistently, the rules for doing that would >>> likely be pretty complex. Better to take the relatively minor hit of >>> disallowing this overloading (you can always use different names for the >>> type-parameters, if they conflict with the constraint you want to use) than >>> to take the hit of complex scoping rules with lots of exceptions. >>> >>> On Fri, Nov 12, 2021 at 9:48 AM tapi...@gmail.com <tapi...@gmail.com> >>> wrote: >>> >>>> I expect the following code compilers okay, but it doesn't. >>>> It looks All the three "I" in the Bar function declaration are >>>> viewed as the type parameter, whereas the second one is >>>> expected as the constraint I (at least by me). >>>> >>>> package main >>>> >>>> type I interface { M() } >>>> >>>> func Foo(i I) { >>>> i.M() >>>> } >>>> >>>> func Bar[I I](i I) { // cannot use a type parameter as constraint >>>> i.M() >>>> } >>>> >>>> func main() {} >>>> >>>> -- >>>> 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...@googlegroups.com. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/golang-nuts/9fc66e8e-3f99-4c3a-87f7-ce7c1a705cdcn%40googlegroups.com >>>> <https://groups.google.com/d/msgid/golang-nuts/9fc66e8e-3f99-4c3a-87f7-ce7c1a705cdcn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- >> 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/a4ffdc09-02cf-47af-96fc-3ebde3fc5d10n%40googlegroups.com >> <https://groups.google.com/d/msgid/golang-nuts/a4ffdc09-02cf-47af-96fc-3ebde3fc5d10n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- 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/CAHbs%3DNYn-r01bMXTNU2qEtYxxo2pBtL%2BgURYkNrfJH%2BRUq%3DLSA%40mail.gmail.com.