On Thu, Jan 6, 2022 at 8:18 PM Ian Lance Taylor <i...@golang.org> wrote:
> On Thu, Jan 6, 2022 at 8:59 AM 'Axel Wagner' via golang-nuts > <golang-nuts@googlegroups.com> wrote: > > > > • From the definition of type elements, we can see that an embedded > interface type is a type element. Therefore, `any` is a type element. > > • `any` is an alias for `interface{}`, therefore it is a type without > any type elements, therefore the set of its specific types is empty ("For > an interface with no type elements, 𝑆 is the empty set."). > > • `interface{ int; any }` is a type with two type elements. "For an > interface with type elements, 𝑆 is the intersection of the specific types > of its type elements.". Intersecting with an empty set (the specific types > of `any`) gives an empty set > > • Therefore, the set of specific types of `interface{ int; any }` is the > empty set. > > That doesn't seem right. "any" is an interface type and writing > "interface { any }" just embeds the empty interface, which has no > effect. > I think it has no effect on the type set. But it has an effect on the set of specific types. I believe both the rule "for an interface type without type elements S is empty" and the rule "for an interface type with type elements, S is the intersection of the specific types of its type elements" are vital to the working of S - they are, what makes the set easily computable. To answer the question from your comment in the CL: I believe the grammar <https://tip.golang.org/ref/spec#Interface_types> is very unambiguous about `any` being a type element: InterfaceType = "interface" "{" { InterfaceElem ";" } "}" . > InterfaceElem = MethodElem | TypeElem . > MethodElem = MethodName Signature . > MethodName = identifier . > TypeElem = TypeTerm { "|" TypeTerm } . > TypeTerm = Type | UnderlyingType . > UnderlyingType = "~" Type . There is no signature, so it's not a MethodElem. Therefore it must be a TypeElem. > I think the spec is incorrect here (and gri already sent > https://golang.org/cl/375799 for this). > > But maybe there is something else wrong with the description of specific > types. > > Ian > > > > On Thu, Jan 6, 2022 at 5:34 PM Jason Phillips < > jasonryanphill...@gmail.com> wrote: > >> > >> And by "first paragraph of the spec" I mean "first paragraph of the > Structure of interfaces section of the spec". Apologies. > >> > >> On Thursday, January 6, 2022 at 11:11:45 AM UTC-5 Jason Phillips wrote: > >>> > >>> @Brian > >>> > >>> > interface{ int; m() } // [specific type] int (but type set is empty > because int has no method m) > >>> > interface{ int; any } // no specific types (intersection is empty) > [even though the type set is not empty] > >>> > >>> As noted in the first paragraph of the spec, the set of specific types > is calculated by only considering type elements in the interface. Given > that, I think the spec note is wrong in the example being discussed. It > should be "int". Also, regardless of the answer, surely the specific types > for "interface{ int; m() }" and "interface{ int; any}" are always the same? > >>> > >>> On Thursday, January 6, 2022 at 10:37:55 AM UTC-5 tapi...@gmail.com > wrote: > >>>> > >>>> On Thursday, January 6, 2022 at 11:19:40 PM UTC+8 tapi...@gmail.com > wrote: > >>>>> > >>>>> On Thursday, January 6, 2022 at 9:40:52 PM UTC+8 tapi...@gmail.com > wrote: > >>>>>> > >>>>>> On Thursday, January 6, 2022 at 8:35:06 PM UTC+8 Brian Candler > wrote: > >>>>>>> > >>>>>>> No, the mistake is in your reading of the spec. You are > complaining about this line: > >>>>>>> > >>>>>>> interface{ int; any } // no specific types (intersection is empty) > >>>>>>> > >>>>>>> The spec makes it clear that: > >>>>>>> 1. "any" is short for "interface {}" > >>>>>>> 2. "interface {}" has no specific types > >>>>>>> > >>>>>> > >>>>>> I think your logic mistake here is that the operands of the union > and intersection operations are type sets, instead of specific types. > >>>>> > >>>>> > >>>>> This conclusion is not very precise. More precisely, the operands of > the union and intersection operations > >>>>> could be either type set or specific types, but interface types > don't participate in calculations of specific types. > >>>> > >>>> > >>>> This is still not precise. More precisely speaking, in calculations > of specific types, > >>>> interface types don't participate in intersection operations, > >>>> and only "any" (interface{}) is allowed to participate in union > operations. > >>>> The result of a union operation with any as an operand is a blank set. > >>>> > >>>>> > >>>>> > >>>>>> > >>>>>> > >>>>>>> > >>>>>>> You are taking the intersection of the set of one type (int) with > the empty set, and therefore the result is the empty set. Exactly as the > comment says. > >>>>>>> > >>>>>>> On Thursday, 6 January 2022 at 11:47:52 UTC tapi...@gmail.com > wrote: > >>>>>>>> > >>>>>>>> On Thursday, January 6, 2022 at 6:15:06 PM UTC+8 Brian Candler > wrote: > >>>>>>>>> > >>>>>>>>> 1. interface { a;b } is intersection. The "Intersection" between > two sets means things which exist in both sets simultaneously. > >>>>>>>>> 2. interface { a|b } is union. "Union" means a set of things > which which exist in set A or set B. > >>>>>>>>> > >>>>>>>>> Quoting from the spec: > >>>>>>>>> "the predeclared type any is an alias for the empty interface." > >>>>>>>>> "interface{} // no specific types" > >>>>>>>>> "For an interface with type elements, 𝑆 is the intersection of > the specific types of its type elements." > >>>>>>>>> > >>>>>>>>> Can you see now? > >>>>>>>> > >>>>>>>> > >>>>>>>> The explanation is as what I think. > >>>>>>>> But what is your conclusion? Is it a mistake in spec? > >> > >> -- > >> 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/cda21095-d57e-4f9d-8853-4a6a7e683953n%40googlegroups.com > . > > > > -- > > 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/CAEkBMfGV9tfn%2BZfRKs%3DyX2uybnUfxWswRUHww%2B%2BdUQsvP%2B_4FA%40mail.gmail.com > . > -- 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/CAEkBMfG_67AUZvYbunZ%3DxoDGbAW9RfRvFtSnep%3DEYoPWsrqCDg%40mail.gmail.com.